📜  Vue.js Vuex(1)

📅  最后修改于: 2023-12-03 15:05:53.283000             🧑  作者: Mango

Vue.js Vuex

Vue.js 是一套构建用户界面的渐进式框架,而 Vuex 是 Vue.js 最流行的状态管理库之一。Vuex 可以帮助我们管理和组织应用程序的状态,并提供了一些工具和约定帮助我们更好地进行状态管理。

什么是状态管理?

随着应用程序变得越来越复杂,它们也变得越来越难以维护。特别是在大型应用程序中,状态可能会变得非常复杂,这使得难以追踪源数据的变化,并容易导致错误。因此,需要一种可靠的、标准化的方法来管理应用程序中的状态,并确保所有组件都能够访问并反映最新的状态。

状态管理就是将应用程序的所有状态存储在单个位置中,并提供一些约定和工具来访问和更新这些状态。使用状态管理,我们可以确保状态的一致性以及在组件之间共享和协调状态的能力。

为什么需要 Vuex?

在 Vue.js 中,父组件可以将数据传递给子组件来进行通信。但是,当多个组件需要共享同一个状态时,这种方式就不够方便了。在这种情况下,我们可以使用 Vuex 来处理应用程序的状态管理。

Vuex 可以在应用程序中的所有组件之间共享状态,并允许我们准确地控制状态的变化。它提供了单向数据流的概念,使我们能够在应用程序中创建可预测的状态。

Vuex 核心概念
State

State 是应用程序中的所有状态的单一存储库。它类似于一个全局变量,我们可以从任何组件中访问和更改它。在 Vuex 中,State 是响应式的,这意味着任何更改都将自动更新视图。

// 定义 State
const store = new Vuex.Store({
  state: {
    count: 0
  }
})

// 访问 State
store.state.count // 0

// 修改 State
store.state.count = 1
Mutation

Mutation 是用于更改 Vuex store 中的状态的函数。每个 mutation 都有一个字符串的类型和一个处理函数。处理函数接收 state 作为第一个参数,并且可以接收其他可选参数。它的主要作用就是用于更新状态。

Mutation 必须是同步函数,否则调试将变得非常困难。

// 定义 Mutation
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  }
})

// 调用 Mutation
store.commit('increment')
Getter

Getter 用于计算 store 中的派生状态。Getters 接收 state 作为第一个参数,并可以接收其他 getter 作为第二个参数。它可以看作是 store 中的计算属性。Getter 的返回值将被缓存,只有当依赖的状态改变时才会重新计算。

// 定义 Getter
const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: 'Buy milk', done: false },
      { id: 2, text: 'Write code', done: true },
      { id: 3, text: 'Play game', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

// 调用 Getter
store.getters.doneTodos // [{ id: 2, text: 'Write code', done: true }]
Action

Action 用于处理异步操作,可以包含任意异步操作,例如 API 调用和定时器。Action 接收一个 context 对象作为第一个参数,该对象包含 commit、dispatch、state 和 getter 等属性和方法。

Action 不能直接更改 state,它可以通过 commit 方法来提交 mutations 来更新 state。

// 定义 Action
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    incrementAsync(context) {
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  }
})

// 调用 Action
store.dispatch('incrementAsync')
总结

Vuex 是 Vue.js 常用的状态管理库,它通过提供 State、Mutation、Getter 和 Action 等核心概念来组织和管理应用程序的状态。使用 Vuex,我们可以更好地控制应用程序状态的变化,提高应用程序的开发效率和可维护性。