vuex采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。每个应用将仅仅包含一个 store 实例。Vuex 通过 store选项,提供了一种机制将状态从根组件『注入』到每一个子组件中(需调用 Vue.use(Vuex))。
五个核心概念
State: state为store中的最基本的状态。
既然 Vuex 的 store 中的状态是响应式的,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新。这也意味着 Vuex 中的 mutation 也需要与使用 Vue 一样遵守一些注意事项:
最好提前在你的 store 中初始化好所有所需属性。当需要在对象上添加新属性时,你应该
使用 Vue.set(obj, ‘newProp’, 123), 或者以新对象替换老对象。例如,利用 stage-3 的对象展开运算符我们可以这样写:state.obj = { …state.obj, newProp: 123 }Vue.set(obj, 'newProp', 123) state.obj = { ...state.obj, newProp: 123 }
- Getter:getters为从state中派生出的一些状态,相当于state的计算属性。当getter所依赖的state值发生变化时,getters会被重新计算。getters接受store作为第一个参数,暴露为store.getters。getters还可以接受其他getters作为第二个参数。
- Mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。mutation虽然类似于一个事件,但是不能直接调用,要通过store.commit(‘increment’)的方式触发。你可以向 store.commit 传入额外的参数。
mutation 必须是同步函数
你可以在组件中使用 this.$store.commit(‘xxx’) 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。 - Action:因为mutation为同步函数而存在。so Action是可以包含任何异步操作的。但是要记住Action提交的是mutation而不是直接改变state。Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。