Vuex简介 #

什么是 Vuex? #

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

为什么需要状态管理? #

组件间通信的挑战 #

在 Vue 应用开发中,随着应用复杂度的增加,组件间通信面临以下挑战:

text
┌─────────────────────────────────────────────────────┐
│              组件通信面临的挑战                        │
├─────────────────────────────────────────────────────┤
│  1. 父子组件通信:props 和 emit 可以解决              │
│  2. 兄弟组件通信:需要通过共同父组件中转               │
│  3. 跨层级通信:需要逐层传递,代码冗余                 │
│  4. 状态共享:多个组件需要访问同一状态                 │
│  5. 状态同步:状态变化需要通知所有使用组件             │
└─────────────────────────────────────────────────────┘

传统方式的局限 #

javascript
// 父子组件通信 - 简单场景可以
// Parent.vue
<template>
  <Child :message="msg" @update="handleUpdate" />
</template>

// 兄弟组件通信 - 需要通过父组件中转
// Parent.vue
<template>
  <div>
    <ChildA :data="sharedData" />
    <ChildB @change="handleChange" />
  </div>
</template>

// 跨层级通信 - 需要逐层传递
// GrandParent.vue
<template>
  <Parent :user="user" />  // 传递给 Parent
</template>

// Parent.vue
<template>
  <Child :user="user" />  // 再传递给 Child
</template>

// Child.vue
<template>
  <div>{{ user.name }}</div>  // 最终使用
</template>

Vuex 的解决方案 #

Vuex 提供了一个统一的状态管理中心:

javascript
// store/index.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    user: { name: 'John', age: 25 },
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  }
})

// 任意组件直接访问
// ComponentA.vue
export default {
  computed: {
    user() {
      return this.$store.state.user
    }
  }
}

// ComponentB.vue
export default {
  methods: {
    increment() {
      this.$store.commit('increment')
    }
  }
}

Vuex 的核心思想 #

单向数据流 #

Vuex 遵循单向数据流原则:

text
┌──────────────────────────────────────────────────────┐
│                   单向数据流                          │
├──────────────────────────────────────────────────────┤
│                                                      │
│    ┌───────────┐           ┌───────────┐            │
│    │   View    │ ────────▶ │  Actions  │            │
│    │  (视图)   │  dispatch │  (动作)   │            │
│    └───────────┘           └─────┬─────┘            │
│          ▲                       │                   │
│          │                       │ commit            │
│          │                       ▼                   │
│    ┌─────┴─────┐           ┌───────────┐            │
│    │   State   │◀──────────│ Mutations │            │
│    │  (状态)   │  mutate   │  (变更)   │            │
│    └───────────┘           └───────────┘            │
│                                                      │
└──────────────────────────────────────────────────────┘

核心概念 #

text
Vuex 五大核心概念
├── State     ──── 状态:存储应用数据
├── Getter    ──── 派生:计算属性
├── Mutation  ──── 变更:同步修改状态
├── Action    ──── 动作:异步操作
└── Module    ──── 模块:分割状态管理

Vuex 的特点 #

1. 集中式状态管理 #

所有状态存储在一个地方,便于管理和调试:

javascript
const store = createStore({
  state: {
    // 用户信息
    user: null,
    // 购物车
    cart: [],
    // 应用设置
    settings: {}
  }
})

2. 响应式状态 #

状态变化自动触发视图更新:

vue
<template>
  <div>{{ count }}</div>
</template>

<script>
export default {
  computed: {
    count() {
      return this.$store.state.count
    }
  }
}
</script>

3. 可预测的状态变更 #

通过 Mutation 追踪状态变化:

javascript
// 只能通过 mutation 修改状态
mutations: {
  SET_USER(state, user) {
    state.user = user
  }
}

// 调用方式
this.$store.commit('SET_USER', { name: 'John' })

4. 强大的调试能力 #

配合 Vue DevTools 实现时间旅行调试:

text
DevTools 功能
├── 状态快照 ──── 查看每次变更前后的状态
├── 时间旅行 ──── 回到任意历史状态
├── 导入导出 ──── 保存和恢复状态
└── Mutation 日志 ─ 记录所有状态变更

Vuex vs 其他方案 #

Vuex vs Pinia #

特性 Vuex Pinia
学习曲线 中等 较低
TypeScript 需要额外配置 原生支持
模块化 手动配置 自动支持
Mutations 必须使用 不需要
官方推荐 传统项目 新项目

Vuex vs Redux #

特性 Vuex Redux
与框架集成 Vue 专属 框架无关
代码量 较少 较多
学习曲线 较低 较高
异步处理 Actions 中间件
调试工具 Vue DevTools Redux DevTools

Vuex vs 组件状态 #

特性 Vuex 组件状态
适用范围 全局共享 组件内部
持久化 可配置 随组件销毁
调试能力 强大 有限
性能开销

适用场景 #

适合使用 Vuex 的场景 #

text
✅ 推荐使用 Vuex
├── 中大型单页应用 ──── 状态复杂,需要统一管理
├── 多人协作项目 ────── 统一的状态管理规范
├── 需要状态持久化 ──── 保持页面刷新后状态
├── 复杂的组件通信 ──── 跨组件状态共享
└── 需要时间旅行调试 ── 追踪状态变化

不需要 Vuex 的场景 #

text
❌ 可以不用 Vuex
├── 小型应用 ──────── 状态简单,组件通信少
├── 静态网站 ───────── 无复杂交互
├── 简单的 CRUD ────── 状态管理需求简单
└── 快速原型开发 ───── 不需要完整架构

Vuex 的工作原理 #

响应式原理 #

Vuex 利用 Vue 的响应式系统实现状态管理:

javascript
// 简化版原理
class Store {
  constructor(options) {
    // 使用 Vue 的响应式系统
    this._vm = new Vue({
      data: {
        $$state: options.state
      }
    })
  }
  
  get state() {
    return this._vm._data.$$state
  }
}

提交机制 #

javascript
// Mutation 提交过程
commit(type, payload) {
  const mutation = this._mutations[type]
  if (mutation) {
    // 调用 mutation 函数
    mutation.forEach(handler => handler(payload))
  }
}

快速示例 #

一个完整的计数器示例:

javascript
// store/index.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    count: 0
  },
  
  mutations: {
    INCREMENT(state) {
      state.count++
    },
    DECREMENT(state) {
      state.count--
    },
    SET_COUNT(state, value) {
      state.count = value
    }
  },
  
  actions: {
    increment({ commit }) {
      commit('INCREMENT')
    },
    decrement({ commit }) {
      commit('DECREMENT')
    },
    async fetchCount({ commit }) {
      const response = await fetch('/api/count')
      const data = await response.json()
      commit('SET_COUNT', data.count)
    }
  },
  
  getters: {
    doubleCount: state => state.count * 2,
    isPositive: state => state.count > 0
  }
})
vue
<!-- Counter.vue -->
<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double: {{ doubleCount }}</p>
    <button @click="increment">+1</button>
    <button @click="decrement">-1</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapActions } from 'vuex'

export default {
  computed: {
    ...mapState(['count']),
    ...mapGetters(['doubleCount'])
  },
  
  methods: {
    ...mapActions(['increment', 'decrement'])
  }
}
</script>

总结 #

Vuex 是 Vue.js 官方的状态管理解决方案,它通过:

  • 集中式管理:统一管理应用状态
  • 单向数据流:可预测的状态变更
  • 响应式更新:状态变化自动更新视图
  • 强大的调试:时间旅行和状态快照

继续学习 Vuex安装,开始搭建你的 Vuex 开发环境。

最后更新:2026-03-28