Vuex的使用方法简要
写在前面:如果有对Vuex还不知道怎么用或者觉得看官方文档吃力的童鞋,建议读一下这一篇https://segmentfault.com/a/1190000009404727
1. 使用state
state:{ todos:[ { id: 1, text: '...', done: true }, { id: 2, text: '...', done: false} }
2. 使用getters
getters的作用相当于组建中的computed,可以对state中的数据进行过滤并展示:
getters:{ doneTodos: state => { return state.todos.filter(todo => todo.done) } }
3. 使用mutation
mutations:{ increment (state) { //mutation事件类型接受state作为参数 state.count++ } }
调用方式如下:
store.commit('increment')
提交载荷(Payload)意思是像state.commit传入额外的参数,大多数情况,载荷应该是一个对象,这样更易读
mutations:{ increment (state, payload){ state.count += payload.amount } } store.commit('increment', { amount:10 })
//也可以使用对象风格提交mutation:
store.commit({ type: 'increment', amount: 10 })
注意:mutation只能是同步函数
4. 使用actions
actions使用方法与mutations一样,区别在于action只能是异步函数,而mutations里面只能是同步函数。
actions:{ increment (context) { context.commit('increment') } } //context是一个与context有相同方法和属性的对象
5. 在组件中使用Vuex
在组件中的调用方法为
state: $store.state.dialog.show getters: $store.getters.functionname mutations: $store.commit('switch_dialog') actions: $store.dispatch('switch_dialog')
不过这种写法又臭又长,更好的做法是使用mapState、mapGetters和mapActions
state: import { mapState } from 'Vuex' computed:mapState({ localComputed(){} //使用对象展开运算符将此对象混入到外埠对象中 ...mapState({ show:false //...... }) }) getters: import { mapGetters } from 'Vuex' computed:{ ...mapGetters({ 'doneTodoCount' //或者可以给getter属性另取一个名字 doneCount:'doneTodoCount' }) } mutations: import { mapMutations } from 'Vuex' methods:{ ...mapMutations([ 'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')` // `mapMutations` 也支持载荷: 'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)` ]), ...mapMutations({ add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')` }) } actions: import { mapActions } from 'Vuex' methods:{ ...mapActions({ 'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')` // `mapActions` 也支持载荷: 'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)` ]), ...mapActions({ add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')` }) }