├── index.html
├── main.js
├── api
│ └── ... # 抽取出API请求
├── components
│ ├── App.vue
│ └── ...
└── store
├── index.js # 我们组装模块并导出 store 的地方
├── actions.js # 根级别的 action
├── mutations.js # 根级别的 mutation
└── modules
├── cart.js # 购物车模块
└── products.js # 产品模块
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0
},
}
import store from "./store";
new Vue({
el: "#app",
store,
router: router,
render: h => h(App)
});
export default {
data() {
return {};
},
computed: {
count() {
return this.$store.state.count;
}
}
};
state | 存储数据
getters | 加工数据
//声明
getters: {
countText: state => {
return "the count is " + state.count;
}
},
//调用
//在组件中保存 getters 中的数据
computed: {
countText() {
return this.$store.getters.countText;
}
},
mutations | 修改 state 的唯一方式
//声明
mutations: {
setToken(state, newToken) {
state.data.token = newToken;
},
//向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
//使用对象风格的提交方式,整个对象都作为载荷传给 mutation 函数
incrementByAnything(state, payload) {
state.count += payload.more;
}
},
//调用
mounted() {
this.$store.commit("setToken", "bbbbb");
},
actions | 允许异步操作
//先声明mutations
mutations: {
setToken(state, newToken) {
state.data.token = newToken;
},
nameToUppercase(state, friend) {
state.data.fullName = (state.data.fullName + friend).toUpperCase();
},
}
//声明actions,其中只能使用mutations
//actions中可以包括异步操作
//actions方法接受两个参数,第一个可以是对象,第二个是传参(可以是对象)
actions: {
nameToUppercase({ commit,sate }, friend) {
setTimeout(() => {
commit("nameToUppercase", friend);
}, 1500);
},
//也可以这样写,传入vue组件的实例 context
nameToUppercase(context, friend) {
setTimeout(() => {
context.commit("nameToUppercase", friend);
}, 1500);
}
}
//在组件中调用
methods: {
uppercaseName() {
this.$store.dispatch("nameToUppercase", "gs");
},
}
//在一个 actions 方法中,可以调用另一个 actions 方法
actions: {
// ...
actionB ({ dispatch, commit }) {
return dispatch('actionA').then(() => {
commit('someOtherMutation')
})
}
}
利用 async / await 实现组合 action
//在store中定义mutations方法
mutations: {
nameToUppercase(state, friend) {
state.data.fullName = (state.data.fullName + friend).toUpperCase();
},
nameAddmore(state, str) {
state.data.fullName = state.data.fullName + str;
}
}
//在store中定义actions方法
actions: {
async nameAddmore({ commit }) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("add 789");
commit("nameAddmore", "789");
resolve()
}, 2000)
})
},
async nameToUppercase({ commit, dispatch }, friend) {
await dispatch('nameAddmore');
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("uppercase name");
commit("nameToUppercase", friend);
resolve()
}, 1000)
})
}
}
//在组件中调用,可见已经隐藏了所有内部实现
methods: {
uppercaseName() {
this.nameToUppercase("gsaaaa").then(() => {
console.log("all completed");
});
},
}
//执行结果
//2s打印 add 789,显示 zhangkai789
//再1s打印 uppercase name 显示 ZHANGKAI789
//最后打印 all completed 显示 ZHANGKAI789
mapActions 辅助函数的映射
//声明
actions: {
nameToUppercase({ commit,sate }, friend) {
setTimeout(() => {
commit("nameToUppercase", friend);
}, 1500);
},
}
//在组件中调用
methods: {
...mapActions(["nameToUppercase"]),
//在其它方法中调用映射
uppercaseName() {
// do something...
this.nameToUppercase("gsss");
},
}
【…mapActions语法报错的问题】
#安装依赖
npm install --save-dev babel-plugin-transform-object-rest-spread
#在 .babelrc 配置文件中新增
{ "plugins": ["transform-object-rest-spread"] }
更多功能参考
//moduleA
const moduleA = {
namespaced: true,
state: {
name: "zk",
age: 22
},
mutations: {
setName(state, newName) {
state.name = newName;
},
},
}
export default moduleA;
//moduleB
const moduleB = {
namespaced: true,
state: {
name: "gs",
age: 18
},
mutations: {
setName(state, newName) {
state.name = newName;
},
},
}
export default moduleB;
//主模块
import Vue from 'vue'
import Vuex from 'vuex'
import moduleA from './moduleA'
import moduleB from './moduleB'
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
zk: moduleA,
gs: moduleB
}
})
//在Vue根实例上注册 store
import store from "./store";
new Vue({
el: "#app",
store,
router: router,
render: h => h(App)
});
//在组件中使用
computed: {
zkName() {
return this.$store.state.zk.name;//注意 state 的模块调用方式
},
gsName() {
return this.$store.state.gs.name;//注意 state 的模块调用方式
}
},
methods: {
setZkName() {
this.$store.commit("zk/setName", "lili");//注意 mutations 的模块调用方式为【目录式】
},
setGsName() {
this.$store.commit("gs/setName", "bebe");//注意 mutations 的模块调用方式为【目录式】
},
}