之前在项目中用到了vuex,于是便急匆匆的找文档用了,所以也没有认真的从头到尾看一遍,这次有空了看了一遍发现,有很多好用的功能没用到呢,今天在这补下漏。
vuex 就不介绍了, 直接开始查缺补漏。
State
State 是vuex的核心及基础,其他所有的功能,概念都是围绕它展开的, 如何初始化vuex就不说了,直接看文末的参考文档。
值得一提的是,mapState ,它可以一次性引入多个 state属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { mapState } from 'vuex'
// ...
computed: mapState({
count : function(state){ return state.count;},
// 简化 (箭头函数)
count: state => state.count,
// 在简化(传字符串参数)
count: 'count',
// 再简化 (需要同名)
count ,
// 这个就不能想上一步那样简化
countAlias: "count",
// 如果需要对count做一些处理 就必须使用函数了
countPlusLocalState (state) {
return state.count + this.localCount
}
})
把state的属性绑定在computed 里面,只要state值变了,computed也会变,就会触发 dom的修改,这也是组件之间传值的基础。
Getter
Getter就相当于 组件内的计算属性computed。 getter 是 返回一些处理state后的数据,如果不需要处理 ,那直接引用state就行了。
假如, 在一个组件的computed 里面有这么一句:1
2
3
4
5
6
computed: {
getMonth () {
return this.$store.state.date.getMonth()+1;
}
}
如果就这么一个组件 需要获取日期的月份,那这么写ok, 那如果有多个呢,每个组件都要重写一遍,那太low了。
这时候你需要一个getter:1
2
3
4
5
6
7
8
9
10state:{...},
getters: {
getMonth: state => {
return state.date.getMonth()+1;
}
}
// XXX.vue 使用
this.$store.getters.getMonth
这波操作就很nice ,
Getter 还可以传参数,
1 | getters: { |
getter 也有个 mapGetters 函数 ,和mapState用法一致
1 |
|
Mutation
有了Getter获取state属性,接下来就是 修改属性 mutation了
1 | state: { |
mutations 里面的函数必须是同步的,不能是异步,否则很难调试,如果调用多个异步mutation,你不知道哪个异步函数什么时候调用完成,哪个先完成。
如果有异步的操作,就使用 Actions 。
Module
一般的vuex里只到处了一个对象, 当项目比较大,state里面的数据会很多, 你可以进一步模块化,到处多个 module1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
this.$store.state.a // -> moduleA 的状态
this.$store.state.b // -> moduleB 的状态
参考 : vuex中文文档