如何使用 Vuex 进行数据管理及状态共享?

什么是 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 等核心概念,以便更好地管理和共享状态。