Vuex全局的状态统一管理,解决组件之间状态共享和数据通信的问题。

第一步

store.js

第二步

main.js

import Vue from 'vue'import App from './App.vue'import router from './router'import store from './store'

Vue.config.productionTip = false

new Vue({  router,  store, // 增加store属性,值是导出store的实例  render: h => h(App)}).$mount('#app')

通过上面两个步骤,每个组件中都有了$store属性,就是我们创建的容器。里面有commit,dispatch,state,getters,actions,mutations,在每个组件中可以通过this.$store打印出来看看。

开始使用

定义状态

export default new Vuex.Store({state: {    count: 1 // state中定义响应式的数据  }})

使用状态:在store的state中定义的状态count,在组件中可以使用this.$store.state.count获取。


定义mutations

在store的mutations中添加对应的方法

export default new Vuex.Store({  state: {    count: 1 // state中定义响应式的数据  },  mutations: {    addTen (state, num) {        state.count = state.count + num    }  },  actions: {

  }})

提交mutations
组件中通过commit提交mutations去修改state中的状态

this.$store.commit('addTen', 10)

定义actions
在store的actions中添加对应的方法

export default new Vuex.Store({state: {count: 1  },mutations: {    addTen (state, num) {// 第一个参数是状态,第二个是传入的参数        state.count = state.count + num    }  },actions: {    minusTen ({commit}, num) {// 第一个参数是store实例,第二个是传入的参数        setTimeout(() => {            commit('addTen', num)        }, 1000)    }  }})

派发动作
组件中可以使用dispatch派发一个动作,来触发actions中的方法,actions可以异步的提交mutations去修改state中的状态

this.$store.dispatch('minusTen', 10)

actions主要是复用,封装代码,处理异步,请求接口等等,真正修改状态放到了mutations中处理


定义getters
在store的getters中添加对应的方法

export default new Vuex.Store({state: {count: 1,person: {name: '张三'    }  },getters: {    getName (state) {// getters是同步的return state.person.name    }  }})

使用getters

this.$store.getters.getName

getters定义的方法相当于计算属性,相当于定义在computed一样,有缓存,依赖改变会重新计算。

组件代码演示

<template><div class="hello"><h1>{{ this.$store.state.count }}</h1><h1>{{ this.$store.getters.getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>

<script>export default {methods: {    syncAdd () {this.$store.commit('addTen', 10)    },    asyncAdd () {this.$store.dispatch('minusTen', 10)    }  }}</script>

简写

上面的写法都是在this.$store中获取属性或方法进行操作。

this.$store.state.countthis.$store.getters.getNamethis.$store.commit('addTen', 10)this.$store.dispatch('minusTen', 10)

但是这些操作写起来比较繁琐,每次都要写this.$store,为了简写,所以vuex提供了一些映射的方法,直接导入到组件中就可以使用了。

<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>

<script>import {mapActions, mapState, mapMutations, mapGetters} from 'vuex'export default {computed: {    ...mapState(['count']),    ...mapGetters(['getName'])  },methods: {    syncAdd () {this.addTen(10)    },    asyncAdd () {this.minusTen(10)    },    ...mapActions(['minusTen']),    ...mapMutations(['addTen'])  }}</script>

有一点需要说明的是,使用扩展运算符,表示这些方法返回的都是对象,mapStatemapGetters需要定义在计算属性中,因为他们定义的数据是响应式的。而mapActionsmapMutations需要定义在methods中。

拆分模块

状态是可以分层的,当一个项目维护的状态太多,可以拆分成单独的模块,在定义store中有个modules属性,里面可以定义单独的模块。

import Vue from 'vue'import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({modules: {'page1': {namespaced: true,state: {count: 1,person: {name: '张三'        }      },mutations: {        addTen (state, num) {          state.count = state.count + num        }      },actions: {        minusTen ({commit}) {          setTimeout(() => {            commit('addTen', 10)          }, 1000)        }      },getters: {        getName (state) {return state.person.name        }      }    }  }})

在组件中这样用

<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>

<script>import {mapActions, mapState, mapMutations, mapGetters} from 'vuex'export default {computed: {    ...mapState('page1', ['count']),    ...mapGetters('page1', ['getName'])  },methods: {    syncAdd () {this.addTen(10)    },    asyncAdd () {this.minusTen(10)    },    ...mapActions('page1', ['minusTen']),    ...mapMutations('page1', ['addTen'])  }}</script>

每个方法都传了两个参数,第一个参数指定命名空间,第二个参数是对应的属性,为了进一步简写,可以通过帮助函数指定命名空间,指定当前组件在使用的模块。

<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>

<script>import { createNamespacedHelpers } from 'vuex'// 创建帮助函数指定命令空间let { mapActions, mapState, mapMutations, mapGetters } = createNamespacedHelpers('page1')

export default {computed: {    ...mapState(['count']),    ...mapGetters(['getName'])  },methods: {    syncAdd () {this.addTen(10)    },    asyncAdd () {this.minusTen(10)    },    ...mapActions(['minusTen']),    ...mapMutations(['addTen'])  }}</script>

不使用简写

this.$store.getters['page1/getName']this.$store.state.page1.countthis.$store.commit('page1/addTen', 10)this.$store.dispatch('page1/minusTen', 10)

推荐图书


10分钟学会vuex相关推荐

  1. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    原文:UWP开发入门(十九)--10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支 ...

  2. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...

    原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...

  3. 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...

    引流网赚之百度贴吧窍门:实操引流教程<百度贴吧零成本自动顶帖>+<10分钟学会豆瓣顶帖引流> 关于百度贴吧的引流方式有很多,像常见的关键词排名引流,比如,百度贴吧引流效果好不好 ...

  4. NiosII软处理器快速入门- 10分钟学会NiosII(1)

    http://hi.baidu.com/hieda/blog/item/7f69080e9efb80ce7bcbe13d.html Nios简单介绍: Nios II是一个用户可配置的通用RISC嵌入 ...

  5. 手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏

    Python 飞机大战|10 分钟学会用 python 写游戏 2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年! 除了在科学计算领域 python 有用武之地之外, 在 ...

  6. #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能

    #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能 人类宝宝在出生后的第1年里,就会逐渐掌握协调能力,学习坐.立.翻滚和爬行. 那么机器人呢? 机器人能完成多复杂的任务 ...

  7. 惠普服务器win10安装系统教程,惠普笔记本U盘装Win10系统图文教程 10分钟学会重装系统...

    U盘装系统,是电脑爱好者"老生常谈"的一个话题,在"电脑百事网"能找到许多类似的教程文章,不过今天的教程与往期有些不一样,首先是制作启动U盘,选用了一些更安全的 ...

  8. 最完整的WordPress建站教程,新手10分钟学会建站

    假如你是一个菜鸟,也能从0开始,10分钟学会搭建(wordpress,Dede,Discuz!..)网站. 网站=域名+空间和数据库+网站程序+模板 1准备材料 [域名] 网址就相当于家的住址,记住和 ...

  9. pulsar 容量_[Pulsar系列] 10分钟学会Pulsar消息系统概念

    Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar在Yahoo的生产环境运行了三年多 ...

最新文章

  1. 漫画:如何螺旋遍历二维数组?
  2. 微信客服系统开发SDK使用教程- 拉取当前微信个人号列表请求(立即)
  3. 老子今天不加班,程序员也需要自由
  4. C++直接初始化与复制初始化的区别深入解析
  5. Teams Bot开发系列:Activity和Turn
  6. k8s mysql数据同步_K8s——MySQL实现数据持久化
  7. x86异常处理与中断机制(3)中断处理过程
  8. LeetCode 第 26 场双周赛(363/1971,前18.4%)
  9. Linux下netstat常用,Linux netstat常用命令
  10. javascript 停止事件冒泡以及阻止默认事件冒泡
  11. 中小企业成败关键在于老板
  12. 微服务架构下,DLI的部署和运维有何奥秘?
  13. addeventlistener不支持ajax_好程序员web前端学习路线分享了解AJAX是什么
  14. oracle 调用java 类_oracle数据库PL SQL调用Java类程序代码
  15. 团队天梯赛L1-001
  16. shelve模块使用说明
  17. 方舟生存计划怎么删除服务器信息,方舟进化生存怎么删服务器存档
  18. 吉安市推行“区块链+电子证照+无证办理”模式
  19. 【ISO9126】软件质量模型的介绍(软件质量管理的六大特征和二十七个子特征)
  20. RabbitMQ下载与安装

热门文章

  1. “我们的边缘计算技术点,可能超前了业界一点”
  2. 腾讯或推动斗鱼虎牙合并;拼多多推出“百亿补贴节”;Electron 9.2.0 发布| 极客头条
  3. 国士无双:卖掉美国房子,回国创办姚班,他只为培养一流的程序员!
  4. 诽谤、窃密、禁令、和解:文远知行创始团队纠纷暂时完结
  5. 用 Python 手写机器学习最简单的 KNN 算法
  6. @程序员,计算机重启包治百“病”?
  7. AI 算法在 FPGA 芯片上还有这种操作?
  8. 今日头条或推“多闪”对垒微信;快播王欣马桶 MT 被封;高通拒为 iPhone 提供芯片 | 极客头条...
  9. 马化腾评 ofo 溃败原因;京东到家否认裁员;王兴质押全部摩拜股权 | 极客头条...
  10. 阿里云计算赶超 IBM;扎克伯格或遭逼宫;IntelliJ IDEA 新版支持 Java 11 | CSDN极客头条...