摘录自文档,自己面试用的
Vuex 是一个集中式状态管理库,当多个组件需要共享状态时使用,并且可以通过调试工具 devtools,保存状态快照,可以记录状态改变。 Vuex的核心是 store(仓库),store里面维护着state,getters,mutations,actions,modules。
Vuex 和单纯的全局对象有以下两点不同:
一、Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。如何在 Vue 组件中展示state呢?由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态:
const Counter = {
template: `<div>{{ count }}</div>`,
computed: {
count () {
return this.$store.state.count
}
}
}
每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。
当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以在计算属性computed中使用 mapState 辅助函数帮助我们生成计算属性。
二、我们不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。
getters
getter可以认为是 store 的计算属性(computed)。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
mutations
改变state, mutation 必须是同步函数
mutations: {
increment (state, n) {
state.count += n
}
}
store.commit('increment', 10)
action
Action 类似于 mutation,不同在于:
Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。
你在组件中使用 this.$store.dispatch(‘xxx’) 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store),store.dispatch 返回的是 Promise对象
store.dispatch('actionA').then(() => {
// ...
})