Vue 笔记 4 - vuex
Vuex是专门在Vue中实现集中式状态(数据)管理的一个Vue插件, 对vue应用中多个组件的共享状态进行集中式的管理(读/写)
也是一种组件间通信的方式,且适用于任意组件间通信。
Github地址:https://github.com/vuejs/vuex
什么时候使用
- 多个组件依赖于统一状态
- 来自不同组件的行为需要变更同一状态
vuex 原理
- Actions : 服务员
- Mutations : 后厨
- State : 菜肴
安装
1 | npm i vuex |
搭建环境
- 创建文件:
src/store/index.js
1 | // 该文件用于创建Vuex中最为核心的store |
- 在
main.js
中创建vm时传入store
配置项
1 | // 引入Vue |
getters
当state中的数据需要经过加工后再使用时,可以使用getters加工,
在store.js中追加getters配置:
1 | const getters = { |
四个map方法的使用
mapState方法:用于帮助我们映射state中的数据为计算属性:
1
2
3
4
5
6
7computed: {
// 第一种方式:借助mapState生成计算属性,从state中读取数据。(对象写法)
...mapState({he:'sum', xuexiao:'school', xueke:'subject'}),
// 第二种方式:要求生成的计算属性名和state中的属性名一致。(数组写法)
...mapState(['sum', 'school', 'subject']),
}mapGetters方法: 用于帮助我们映射getters中的数据为计算属性
1
2
3
4// 第一种方式:借助mapGetters生成计算属性,从getters中读取数据。(对象写法)
...mapGetters({bigSum:'bigSum'}),
// 第二种方式:要求生成的计算属性名和getters中的属性名一致。(数组写法)
...mapGetters(['bigSum'])mapActions方法: 用于帮助我们生成与actions对话的方法,即:包含
$store.dispatch(xxx)
的函数1
2
3
4
5
6methods:{
// 靠mapActions生成: incrementOdd、incrementWait(对象形式)
...mapActions({incrementOdd:'jiaOdd', incrementWait:'jiaWait'})
// 靠mapActions生成: incrementOdd、incrementWait(数组形式)
...mapActions(['jiaOdd', 'jiaWait'])
}mapMutations方法:用于帮助我们生成与
mutations
对话的方法,即:包含$store.commit(xxx)
的函数1
2
3
4
5
6
7
8
9
10
// 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
...mapActions({incrementOdd: 'addOddAction', incrementWait: 'addWaitAction'})
// 借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)
...mapActions(['addOddAction', 'addWaitAction'])
// 注意数组写法要求调用处需要修改为数组中生成的函数名:
<button @click="addOddAction(n)">当前求和为奇数再加</button>
<button @click="addWaitAction(n)">等一等再加</button>
备注:mapActions与mapMutations使用时,若需要传递参数,需要在模板中绑定事件时传递好参数,否则参数是事件对象。
模块化和命名空间
目的: 让代码更好维护,让多种数据分类更加明确
开启命名空间
修改:moduleA.js
1 | const moduleAOptions = { |
moduleB.js
1 | export default { |
index.js
1 | // 该文件用于创建Vuex中最为核心的store |
开启命名空间后,组件中读取state
数据
1 | // 方式1: 自己直接读取 |
开启命名空间后,组件中读取getters
数据
1 | // 方式1: 自己直接读取 |
开启命名空间后,组件中调用dispatch
1 | // 方式1: 自己直接dispatch |
开启命名空间后,组件中调用commit
1 | // 方式1: 自己直接commit |