Vuex 是 Vue.js 专用的状态管理模式和库,统一管理应用的全局状态,解决组件之间的数据共享问题。其本质原理是利用 Vue 提供的响应式系统,配合 Vue 的数据响应机制实现数据驱动视图更新。
Vuex主要包括如下几个模块:
模块 | 功能 | 是否响应式 |
State | 存储全局状态的数据对象 | ✅ |
Getters | 对 State 数据进行加工处理,类似组件内的 computed 计算属性 | ✅ |
Mutations | 同步修改 State 数据的唯一方法,触发响应式更新 | ❌(只是触发更新,不必响应式) |
Actions | 提交 Mutations,可以包含异步逻辑 | ❌ |
Modules | 分模块管理状态,方便扩展与维护 | ❌ |
Vuex 最根本的原理是基于 Vue 本身的数据响应系统:
通过 new Vue() 或 Vue.observable 方法: 将 state 对象定义为 Vue 实例的 data 属性或通过 Vue.observable 变成响应式。
// 简单的响应式 state 实现示例 let state = Vue.observable({ count: 0 });
当 state 数据变化时,任何使用 state 数据的组件都会自动响应式更新。
store 是一个单例对象,整个应用仅有一个。
store 实例包含 State、Getters、Mutations、Actions 等成员。
核心示意代码:
class Store { constructor(options) { this._vm = new Vue({ data: { $$state: options.state } }); this.getters = {}; Object.keys(options.getters || {}).forEach(getterName => { Object.defineProperty(this.getters, getterName, { get: () => options.getters[getterName](this.state) }); }); this.mutations = options.mutations || {}; this.actions = options.actions || {}; } // 提供 state 访问方式 get state() { return this._vm._data.$$state; } // mutation必须同步执行 commit = (type, payload) => { const mutation = this.mutations[type]; if (mutation) mutation(this.state, payload); else console.error(`[vuex] unknown mutation type: ${type}`); }; // action 可以异步 dispatch = (type, payload) => { const action = this.actions[type]; if (action) return action(this, payload); else console.error(`[vuex] unknown action type: ${type}`); }; }
辅助函数 mapState、mapGetters、mapMutations、mapActions,方便组件使用 store 中的数据与方法。
示例:
// vue组件内使用vuex的辅助函数示例 import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'; export default { computed: { ...mapState(['count']), ...mapGetters(['doubleCount']) }, methods: { ...mapMutations(['increment']), ...mapActions(['incrementAsync']) } };
严格模式下,只能通过 mutation 修改 state,防止不规范的 state 修改行为:
const store = new Vuex.Store({ strict: true });
严格模式原理是使用 Vue 提供的 watch API 监听 state 变化,判断 state 变化是否是 mutation 导致的。如果不是,会给出警告。
Vue组件 │ dispatch (异步) → Actions ──commit──→ Mutations │ │ └─────────→ commit (同步) ←───┘ │修改 ▼ State (响应式对象) │ ▼ 通知组件更新
面试官追问 | 推荐回答 |
state是如何实现响应式的? | 基于Vue自身的响应式系统:使用Vue.observable或Vue实例实现 |
为什么只能通过mutation修改state? | 保证所有的状态修改有迹可循,便于追踪变化、调试与维护 |
为什么actions允许异步而mutations不允许异步? | 因为mutation必须是可预测、可追踪的同步修改状态,异步逻辑统一封装在actions中,更好维护 |
什么时候用 getters? | 当store数据需要做复杂计算或多组件共享计算逻辑时 |
Vuex 实质是利用 Vue 的响应式系统。
统一状态数据到单例 store 中,提供明确、规范的状态修改方式(Mutation 同步、Action 异步)。
通过严格模式、辅助方法确保开发规范,提供良好开发体验。