Vuex 是 Vue.js 的官方状态管理库,其核心原理如下:
一、核心思想
Vuex 是一个专为 Vue.js 应用程序开发的集中式状态管理模式,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
二、核心原理分解
1. Vue 插件机制
Vuex 通过 Vue.use(Vuex)
注册为 Vue 插件,在安装时通过 Vue.mixin
将 store 注入到所有组件中,使得每个组件可以通过 this.$store
访问 Vuex 的实例。
2. 单一状态树(Single State Tree)
Vuex 使用单一的对象(通常称为 state)来保存整个应用的状态,这个对象是响应式的,并且是唯一的,便于管理和调试。
3. 响应式原理(基于 Vue 的响应式系统)
Vuex 的核心状态 state
是一个普通的 JavaScript 对象,但 Vuex 利用了 Vue 的响应式系统,将 state 作为 Vue 实例的一个 data 属性进行响应式处理,从而使得当 state 发生改变时,依赖该状态的组件会自动重新渲染。
4. Mutations(同步修改状态)
- 唯一修改 state 的方式是通过提交 mutation,即调用
store.commit('mutationName', payload)
。 - Mutation 是一个同步函数,它接收 state 作为第一个参数,可以接收额外的参数(payload)。
- 这样做是为了让状态变更可追踪、可调试(比如配合 DevTools)。
5. Actions(异步操作)
- Action 类似于 mutation,但是它可以包含异步操作(如 API 请求)。
- Action 不直接修改 state,而是通过提交 mutation 来间接更改状态,即调用
context.commit('mutationName')
。 - 组件通过
store.dispatch('actionName', payload)
触发 action。
6. Getters(计算属性)
- Getter 用于从 state 中派生出一些状态,类似 Vue 的 computed。
- 可以对 state 进行过滤、计算,且具有缓存特性,只有依赖的 state 变化时才会重新计算。
- 组件通过
this.$store.getters.xxx
来访问。
7. 模块化(Modules)
- 随着项目规模增大,可以将 store 分割成模块(module),每个模块拥有自己的 state、mutations、actions、getters。
- Vuex 允许将 store 分模块管理,便于维护和复用。
三、流程简述
1. 初始化时:创建 Vuex.Store 实例,传入 state、mutations、actions、getters 等配置,Vue 插件机制将其注入到所有组件。
2. 组件访问状态:组件通过 this.$store.state
读取状态,通过 this.$store.commit()
提交变更,通过 this.$store.dispatch()
触发异步操作。
3. 状态变更:只有通过 mutation 才能真正改变 state,确保变更可控、可追踪。
4. 响应式更新:由于 state 是响应式的,当其改变时,依赖该状态的组件自动重新渲染。
总结一句话:
Vuex 的原理是基于 Vue 的响应式系统,通过集中管理 state,以 mutation 同步修改、action 处理异步逻辑、getter 派生状态,并通过 Vue 插件机制使所有组件可方便访问,从而实现可预测、可维护的全局状态管理。