Skip to content

Vuex 的基本概念

Vuex 是 Vue.js 的官方状态管理库,它的核心作用是集中管理和维护应用的状态(例如,用户登录状态、主题色、购物车数据等),并通过单向数据流确保数据的可预测性和一致性。Vuex 使得不同组件之间的状态共享变得更加容易和清晰。

Vuex 的原理

Vuex 的核心原理基于 单向数据流响应式数据。它通过四个主要概念来管理状态:StateGettersMutationsActions。这些概念的设计使得 Vuex 的工作方式具有高度的可预测性和可维护性。

1. State(状态)

Vuex 中的 state 就是存储应用的状态数据。它类似于 Vue 组件中的 data,但是它是集中式管理的,所有组件都可以访问并共享它。

1.1 响应式

Vuex 的 state 是响应式的,意味着当 state 发生变化时,所有依赖该 state 的组件会自动更新。这依赖于 Vue 的响应式系统。

1.2 定义方式

javascript
const store = new Vuex.Store({
  state: {
    count: 0
  }
});

2. Getters(获取器)

Getters 是 Vuex 中的计算属性,用来从 state 中派生出一些状态数据。你可以将 getters 看作是 state过滤器计算值

  • 作用getters 用于获取 state 的数据,并可以对数据进行计算或转换。
  • 响应式getters 也是响应式的,当 state 改变时,getters 会自动重新计算。

2.1 定义方式

javascript
const store = new Vuex.Store({
  state: {
    count: 0
  },
  getters: {
    // 计算 `count` 的平方
    squaredCount(state) {
      return state.count * state.count;
    }
  }
});
  • 你可以通过 store.getters.squaredCount 来访问该值。

3. Mutations(突变)

Mutations 是 Vuex 中唯一可以改变 state 的地方。Vuex 强制要求我们通过提交 mutation 来修改 state,这是一种同步操作。

3.1 为什么要使用 Mutations?

  • 追踪变更:每个 mutation 都是同步的,并且是可追踪的。因此,开发者可以在开发过程中轻松地进行状态追踪。
  • 调试:使用 mutation 使得状态变化可预测。开发者可以记录每次变更的发生,轻松地回溯和查看历史。

3.2 定义方式

javascript
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    // 增加计数器
    increment(state) {
      state.count++;
    },
    // 减少计数器
    decrement(state) {
      state.count--;
    }
  }
});
  • 你可以通过 store.commit('increment') 来提交 mutation,从而更新 state

4. Actions(动作)

Actions 用于处理 异步操作,比如发起 HTTP 请求、获取远程数据、定时器等。actions 可以通过 commit 提交 mutation 来改变 state,但它本身不直接修改 stateactions 中可以包含异步代码。

4.1 为什么要使用 Actions?

  • 异步操作mutations 必须是同步的,而 actions 允许你进行异步操作,并在异步操作完成后再提交 mutation
  • 业务逻辑actions 通常用于执行应用的逻辑,例如数据请求、异步计时等。

4.2 定义方式

javascript
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    async incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    }
  }
});
  • 你可以通过 store.dispatch('incrementAsync') 来调用 action,触发异步操作。

5. 模块化(Modules)

Vuex 允许将 store 分割成多个模块,每个模块都有自己的 statemutationsactionsgetters,以便在大型应用中进行状态管理的分隔。

5.1 模块化的好处

  • 在大型项目中,随着项目变得越来越复杂,store 可能会非常庞大。使用模块化可以避免 store 过于臃肿。
  • 每个模块可以有自己的状态、变更和行为,使得代码更加清晰、可维护。

5.2 定义方式

javascript
const store = new Vuex.Store({
  modules: {
    counter: {
      state: {
        count: 0
      },
      mutations: {
        increment(state) {
          state.count++;
        }
      },
      actions: {
        incrementAsync({ commit }) {
          setTimeout(() => {
            commit('increment');
          }, 1000);
        }
      }
    }
  }
});
  • 通过 store.state.counter.count 访问模块状态。
  • 通过 store.dispatch('counter/incrementAsync') 调用模块中的 action

Vuex 的工作流程

  1. 组件访问状态:组件通过 this.$store.state 访问 Vuex 中的 state
  2. 触发 mutation:组件通过 this.$store.commit('mutationName') 触发 mutation,从而修改 state
  3. 异步操作:如果需要异步操作,组件会通过 this.$store.dispatch('actionName') 调用 actionsactions 处理异步逻辑并最终通过 commit 提交 mutation 来修改 state
  4. 响应式更新:由于 Vuex 中的 state 是响应式的,一旦 state 发生变化,所有依赖该 state 的组件会自动重新渲染。

6. Vuex 的设计理念

Vuex 的设计理念是 单向数据流集中式状态管理,通过以下特点来保证数据流的清晰性:

  • 单一数据源:应用中的所有状态都存储在一个单一的 store 中。
  • 只有 mutation 能改变 state:通过 mutation 来同步修改状态,确保数据的可追踪性。
  • Actions 用于处理异步操作:所有异步操作都通过 actions 来处理,从而确保 mutation 是同步的。

总结

Vuex 通过集中式管理和单向数据流确保了应用的状态和行为的可预测性。其基本原理包括:

  • State:应用的状态数据。
  • Getters:派生状态,用于计算和过滤。
  • Mutations:用于同步修改状态的唯一方法。
  • Actions:用于处理异步操作,并最终提交 mutation

Vuex 的设计理念保证了应用的状态始终清晰和可维护,尤其适用于中大型 Vue 应用的状态管理。