一、先搞懂:什么是 “全局状态”?
可以把 全局状态 = 整个项目共享的数据
这些数据不应该只属于某一个页面,而是整个 APP 都能访问、都能修改。
比如:
- 用户登录信息(头像、昵称、token)
- 购物车数量
- 主题颜色(暗黑 / 白天)
- 全局弹窗、加载状态
- 多个页面都要用到的公共数据
二、为什么要用 Vuex?(解决什么痛点?)
Vuex 就是为了解决:
让所有页面共享一套数据,统一管理、统一修改、自动同步。
不用 Vuex 会遇到的问题:
- 页面之间传值太麻烦(父子、兄弟、跨页面传值写死你)
- 数据到处散落,这个页面存一份,那个页面改一下,容易乱
- 数据无法同步,A 页面改了,B 页面不知道
- 代码难以维护,后期不知道数据从哪来、到哪去
一句话总结:Vuex = 项目里的 “公共数据仓库”
三、Vuex 核心 5 个概念(超级好记)
我给你简化成最容易理解的版本:
1. State(唯一数据源)
- 作用:存数据
- 就像组件里的
data(),但它是全局的 - 所有页面都能从这里拿数据
js
state: {
userInfo: {}, // 用户信息
cartCount: 0 // 购物车数量
}
2. Getters(计算属性)
- 作用:从 state 里加工数据
- 相当于全局的
computed
js
getters: {
getUserNickname: state => state.userInfo.nickname
}
3. Mutations(唯一修改数据的地方)
- 作用:修改 state
- 必须是同步函数(不能写异步)
- Vuex 规定:只能通过 mutation 修改 state
js
mutations: {
SET_USER_INFO(state, data) {
state.userInfo = data
}
}
4. Actions(处理异步 + 提交 mutation)
- 作用:处理异步操作(请求接口、定时器)
- 自己不直接改数据,而是提交 mutation 去改
- 相当于 “业务逻辑层”
js
actions: {
async login({ commit }, userData) {
// 1. 发请求(异步)
let res = await api.login(userData)
// 2. 提交 mutation 修改 state
commit('SET_USER_INFO', res.data)
}
}
5. Modules(模块化)
- 项目大了,把 Vuex 拆成多个模块
- 比如:user、cart、setting 等
四、Vuex 工作流程(最重要!一张图看懂)
plaintext
组件页面
↓(想改数据)dispatch 触发
Actions(异步请求/逻辑)
↓(提交)commit 触发
Mutations(唯一能改数据)
↓ 修改
State(全局数据)
↓ 数据更新
所有用到数据的页面 **自动更新**
**超级口诀:**组件调用 dispatch → 走 actions → 提交 commit → 走 mutations → 改 state → 页面自动刷新
五、最常用代码示例(直接复制就能用)
1. 定义 Vuex 仓库
js
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
token: '',
userInfo: null
},
getters: {
getToken: state => state.token
},
mutations: {
SET_TOKEN(state, val) {
state.token = val
},
SET_USER_INFO(state, data) {
state.userInfo = data
}
},
actions: {
// 登录
async userLogin({ commit }, formData) {
// 模拟请求
let res = { token: '123456', user: { name: '张三' } }
commit('SET_TOKEN', res.token)
commit('SET_USER_INFO', res.user)
}
}
})
2. 页面使用(拿数据 + 改数据)
vue
<!-- 页面组件 -->
<template>
<div>{{ userInfo }}</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default {
computed: {
...mapState(['userInfo', 'token'])
},
methods: {
login() {
// 调用 vuex 的 action
this.userLogin({ account: 'test', pwd: '123' })
},
...mapActions(['userLogin'])
}
}
</script>
六、你必须记住的 3 条规则
-
state 只读,不能直接改
js
// ❌ 错误 this.$store.state.token = 'xxx' // ✅ 正确 this.$store.commit('SET_TOKEN', 'xxx') -
异步操作必须放 actions(请求、延时等)
-
修改数据唯一入口是 mutations
七、一句话终极总结
Vuex 就是给整个 Vue 项目用的 “公共数据管家”,统一存、统一改、所有页面自动同步。
关键点回顾
- State:存数据
- Getters:计算数据
- Mutations:同步改数据(唯一入口)
- Actions:异步逻辑,提交 mutation
- 流程:组件 → dispatch → action → commit → mutation → state → 页面更新