安装Vuex插件
Vuex3匹配Vue2
Vuex4匹配Vue3
npm i vuex@3
Vuex引入
在与main.js
文件同级的目录下增加一个store
文件夹
store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import calculator from './calculator';
import person from './person';
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
calculator,
person
}
});
main.js
将Vuex.Store
实例对象放到Vue
实例对象的store
属性中
import Vue from 'vue'
import App from './App.vue'
import store from './store'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
store
}).$mount('#app')
Vuex模块
state
定义状态actions
定义action,action通过调用mutation以修改state,并增加自己的额外操作mutations
定义mutation,单纯修改state,不可增加异步操作getters
定义getter,获取state时对state进行计算变换
此例中编写calculator和person两个模块
store/calculator,js
export default {
namespaced: true,
actions: {
addWhenOdd(context, value) {
if (context.state.sum % 2 == 1) {
context.commit('ADD', value);
}
},
addWait(context, value) {
setTimeout(() => {
context.commit('ADD', value);
}, 1000);
}
},
mutations: {
ADD(state, value) {
state.sum += value;
},
SUBSTRACT(state, value) {
state.sum -= value;
}
},
state: {
sum: 0
},
getters: {
sumMultipliesTen(state) {
return state.sum * 10;
}
}
}
store/person.js
export default {
namespaced: true,
actions: {
},
mutations: {
ADD_PERSON(state, value) {
state.personList.unshift(value);
}
},
state: {
personList: []
}
}
Vuex操作
直接调用mutation
this.$store.commit('calculator/ADD', this.operator);
调用action
this.$store.dispatch('calculator/addWhenOdd', this.operator);
访问state和getter
// 引入mapState和mapGetters
import {mapState, mapGetters} from 'vuex';
// mapState和mapGetters方法返回一个对象,将对象的属性都放到computed对象中
computed: {
...mapState('calculator', ['sum']),
...mapGetters('calculator', ['sumMultipliesTen'])
}
<template>
<div>
<h1>
当前求和为:{{sum}}
</h1>
<h3>
当前求和放大十倍后为:{{sumMultipliesTen}}
</h3>
</div>
</template>
完整例子
import {mapState, mapGetters} from 'vuex';
export default {
name: 'Calculator',
data() {
return {
operator: 1
}
},
methods: {
clickAdd() {
this.$store.commit('calculator/ADD', this.operator);
},
clickSubstract() {
this.$store.commit('calculator/SUBSTRACT', this.operator);
},
clickAddWhenOdd() {
this.$store.dispatch('calculator/addWhenOdd', this.operator);
},
clickAddWait() {
this.$store.dispatch('calculator/addWait', this.operator);
}
},
created() {
},
computed: {
...mapState('calculator', ['sum']),
...mapState('person', ['personList']),
...mapGetters('calculator', ['sumMultipliesTen'])
}
};
PREVIOUSVue插槽使用
NEXTVue Router使用