目录
一、为什么需要Vuex?
当组件层级变深、兄弟组件需要共享数据时,传统的props/$emit
和事件总线会变得难以维护。Vuex通过集中式存储管理应用的所有组件的状态,并确保状态变更的可预测性。
二、Vuex核心概念图解 
三、五种核心状态详解
1.State:数据仓库
作用:存储所有组件的共享状态(响应式数据)
特点:
唯一数据源,不可直接修改
通过
this.$store.state
访问// store.js const store = new Vuex.Store({ state: { count: 0, user: { name: 'John', id: 1 } } }) // 组件中使用 computed: { count() { return this.$store.state.count } }
2.Getters:计算属性
作用:从state派生的新数据(类似组件的computed)
优势:
缓存机制提升性能
支持参数传递
getters: { doubleCount: state => state.count * 2, // 带参数的getter getUserById: state => id => state.users.find(user => user.id === id) } // 组件中使用 computed: { user() { return this.$store.getters.getUserById(2) } }
3.Mutations:同步修改器
作用:唯一修改state的方式(同步操作)
规范:
必须是同步函数
通过
commit
触发建议使用常量定义类型
mutations: { INCREMENT(state, payload) { state.count += payload.amount } } // 组件中触发 methods: { addCount() { this.$store.commit('INCREMENT', { amount: 5 }) // 或对象风格 this.$store.commit({ type: 'INCREMENT', amount: 5 }) } }
4.Actions:异步操作
作用:
处理异步逻辑(API请求等)
通过
dispatch
触发不能直接修改state,需提交mutation
actions: { async fetchUser({ commit }, userId) { const res = await axios.get(`/api/users/${userId}`) commit('SET_USER', res.data) // 提交到mutation } } // 组件中触发 created() { this.$store.dispatch('fetchUser', 123) }
5.Modules:模块化
作用:拆分复杂store为多个模块
特性:
每个模块拥有独立的state/mutations/actions/getters
支持嵌套模块
const userModule = { namespaced: true, // 开启命名空间 state: () => ({ profile: null }), mutations: { SET_PROFILE(state, data) { ... } }, actions: { login() { ... } } } const store = new Vuex.Store({ modules: { user: userModule // 访问:this.$store.state.user.profile } }) // 命名空间内访问(需指定模块路径) this.$store.dispatch('user/login', credentials)
四、各概念关系总结
概念 | 数据流向 | 是否可异步 | 修改权限 |
---|---|---|---|
State | 存储原始数据 | - | 只读 |
Getters | 派生数据 | - | 计算属性 |
Mutations | 修改State | ❌ 同步 | 唯一修改入口 |
Actions | 触发Mutations | ✅ 异步 | 中转站 |
Modules | 组织代码结构 | - | 架构设计 |
五、最佳实践技巧
严格模式:开发时启用
strict: true
,防止直接修改state映射辅助函数:简化代码
import { mapState, mapActions } from 'vuex' computed: { ...mapState(['count']), ...mapGetters(['doubleCount']) }, methods: { ...mapActions(['fetchUser']) }
3.模块动态注册:按需加载模块
store.registerModule('cart', cartModule)
注意:Vue3已推出Pinia作为新一代状态管理,但Vue2项目仍广泛使用Vuex
结语
掌握Vuex的五种核心状态是构建中大型Vue应用的关键。通过本文的代码示例和关系图解,相信您已理解其设计哲学。建议在项目中从简单模块开始实践,逐步体会状态管理的艺术。