什么是 Vuex?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生改变。Vuex 也集成到 Vue 的官方调试工具中,提供了诸如零配置的 time-travel 调试、状态快照导出 / 导入等高级调试功能。
为什么需要 Vuex?
在 Vue.js 应用程序中,组件之间的数据传递和共享很常见。但是,当应用中使用到多个组件时,组件之间就会形成复杂的数据依赖关系,导致代码不易维护。如果使用 Vuex 管理状态,则可以使数据流向更加清晰和易于维护,同时也有助于多个组件之间共享状态。
Vuex 核心概念
1. State
state 对象就是用来存储应用级别状态的。它可以是一个普通的对象,包含多个属性,也可以是一个函数,返回一个包含多个属性的对象。在组件中访问 state 状态的方法通常是使用计算属性。
const store = new Vuex.Store({
state: {
count: 0
}
})
// 在组件中访问
computed: {
count () {
return this.$store.state.count
}
}
2. Getter
getters 能够对 Vuex store 中的 state 进行计算。就像计算属性 computed 一样,getters 的返回值会根据它的依赖被缓存起来,而且只有当它的依赖发生了改变才会被重新计算。
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: 'todo 1', done: true },
{ id: 2, text: 'todo 2', done: false },
{ id: 3, text: 'todo 3', done: true }
]
},
getters: {
doneTodos: state => {
return state.todos.filter(todo => todo.done)
},
doneTodosCount: (state, getters) => {
return getters.doneTodos.length
}
}
})
// 在组件中访问
computed: {
doneTodosCount () {
return this.$store.getters.doneTodosCount
}
}
3. Mutation
mutations 是 Vuex store 中用于修改 state 的唯一途径,它们是同步事务。每个 mutation 都有一个字符串类型的事件类型(type)和一个回调函数(handler)。在回调函数中,我们可以直接修改 state 状态。
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
},
incrementBy (state, n) {
state.count += n
}
}
})
// 在组件中提交
methods: {
increment () {
this.$store.commit('increment')
}
}
4. Action
actions 允许我们在mutation上进行异步操作,它们是可以包含任意异步操作的,最终还会触发 mutation 来更新 state 状态。action 类似于 mutation,但是它是用于提交 mutation 的。而不是直接变更状态。
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
incrementAsync ({ commit }) {
setTimeout(() => {
commit('increment')
}, 1000)
}
}
})
// 在组件中分发
methods: {
incrementAsync () {
this.$store.dispatch('incrementAsync')
}
}
5. Module
Vuex 允许我们将 store 分割成模块,每个模块拥有自己的 state、mutation、action、getter 等。Vuex 模块提供了一种逻辑上分组存放 state 的方式。
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
总结
Vuex 是一个非常强大的状态管理库,适用于中大型 Vue.js 应用程序中。在使用 Vuex 的过程中,应该根据实际情况合理地使用 store、getter、mutation、action 和 module 等核心概念,以便更好地管理和共享状态。