大家好,我是小杨,一个做了6年前端的老司机。今天想和大家聊聊Vuex这个状态管理神器。记得我刚接触Vuex时也是一头雾水,什么state、mutation、action搞得我晕头转向。但用顺手后发现,它简直是中大型Vue项目的救星!今天就让我用最接地气的方式带大家入门Vuex。
一、为什么需要Vuex?
想象一下这个场景:我在做一个电商网站,用户登录后需要在导航栏显示头像,在个人中心页显示用户名,在购物车页显示会员等级...这些组件都需要访问用户信息。如果没有Vuex,我只能:
- 一层层props传下去(太麻烦)
- 用事件总线eventBus(难以维护)
- 每个组件单独请求(性能浪费)
这时候Vuex就像个"全局变量仓库",所有组件都能直接获取最新数据,完美解决以上问题!
二、Vuex核心概念图解
先上个我画的示意图,帮助理解Vuex的工作流程:
[组件] → (dispatch)→ [Actions] → (commit)→ [Mutations] → (mutate)→ [State] → (render)→ [组件]
三、5分钟快速上手
1. 安装Vuex
npm install vuex --save
2. 创建store
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
user: null,
cartCount: 0
},
mutations: {
SET_USER(state, user) {
state.user = user
},
ADD_TO_CART(state) {
state.cartCount++
}
},
actions: {
login({ commit }, userData) {
return new Promise((resolve) => {
// 模拟API请求
setTimeout(() => {
commit('SET_USER', userData)
resolve()
}, 500)
})
}
},
getters: {
isVIP: state => {
return state.user?.level === 'vip'
}
}
})
3. 在main.js引入
import store from './store'
new Vue({
store,
render: h => h(App)
}).$mount('#app')
四、实际开发中的使用姿势
1. 获取状态
// 在组件中
computed: {
username() {
return this.$store.state.user?.name
},
isVIP() {
return this.$store.getters.isVIP
}
}
2. 修改状态(正确姿势!)
// 错误示范:直接修改state
this.$store.state.user = me // ❌ 大忌!
// 正确做法:通过mutation
this.$store.commit('SET_USER', me)
// 异步操作要用action
this.$store.dispatch('login', {
name: '我',
level: 'vip'
}).then(() => {
console.log('登录成功!')
})
五、项目实战技巧
1. 模块化开发
大型项目一定要分模块:
// store/modules/user.js
export default {
namespaced: true,
state: () => ({
profile: null
}),
mutations: { /*...*/ },
actions: { /*...*/ }
}
// 使用时
this.$store.dispatch('user/login')
2. 持久化存储
用vuex-persistedstate插件防止刷新丢失:
import createPersistedState from 'vuex-persistedstate'
export default new Vuex.Store({
plugins: [createPersistedState({
key: 'my-app-store'
})],
// ...
})
3. 简化代码的map辅助函数
import { mapState, mapActions } from 'vuex'
export default {
computed: {
...mapState(['user']),
...mapState('cart', ['items'])
},
methods: {
...mapActions(['login']),
...mapActions('cart', ['addItem'])
}
}
六、常见坑点提醒
- Mutation必须是同步的!异步操作要放在Action里
- 不要直接修改state,要通过commit
- 模块化后记得加命名空间(namespaced: true)
- 大型项目建议把type常量抽离成单独文件
七、什么时候该用Vuex?
根据我的经验:
- ✅ 多个视图依赖同一状态
- ✅ 来自不同视图的行为需要变更同一状态
- ❌ 小型项目用props/event就够了
结语
Vuex初学可能觉得绕,但用习惯后就会发现它的美妙之处。就像我刚开始觉得"这么麻烦不如用全局变量",现在真香警告!如果还有疑问,欢迎在评论区交流~
⭐ 写在最后
请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.
✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式
✅ 认为我部分代码过于老旧,可以提供新的API或最新语法
✅ 对于文章中部分内容不理解
✅ 解答我文章中一些疑问
✅ 认为某些交互,功能需要优化,发现BUG
✅ 想要添加新功能,对于整体的设计,外观有更好的建议
✅ 一起探讨技术加qq交流群:906392632
最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!