Vue.js 中使用 Vuex 做全局数据管理详解

阅读时长 7 分钟读完

前言

在现今的前端开发中,构建大型应用程序时,应用程序的状态管理变得越来越关键。传统的单向数据流会有一些瓶颈,它会增加应用的复杂度,例如组件之间的通讯和复杂的异步操作。随着 Vue.js 的诞生,它带来的 Vuex 状态管理模式也为应用程序的状态管理提供了一种新的解决方案。本文将介绍 Vuex 状态管理模式的详细解释,并且使用一个实例说明如何在应用程序中使用 Vuex。

什么是 Vuex?

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

  • state(状态):存储数据,即组件共享的数据源;
  • mutations(变更):执行操作,用于修改 state 状态;
  • actions(动作):封装异步操作,提交 mutations;
  • getters(获取器):派生 state,将 state 映射到视图。

为什么要使用 Vuex?

在 Vue.js 应用程序中,组件间的数据共享和状态管理是一个必不可少的问题。围绕这个问题,由于多个组件都使用同一数据源进行操作,不同的解决方案会带来不同的问题。例如,全局事件总线、props$emit$parent$children 等等。

而作为一个专门为 Vue.js 应用程序开发的状态管理模式,Vuex 具备以下优点:

  • 易于管理:Vuex 的中心化存储管理模式增加了对应用程序状态的可控性;
  • 可预测的:Vuex 强制所有状态被管理在一个地方,使得状态变化的流程更加规范;
  • 组件间透明:Vuex 不依赖于组件,将状态存储在一个全局的对象中,使得数据共享更加方便;
  • 开发调试友好:Vuex 的严格模式保证了状态变化的可跟踪,便于应用程序的开发调试。

Vuex 简单实例

下面展示一个简单的 Vuex 实例,它包含了一个数据源 count 和两个操作。一个是增加计数器的操作 increment,另一个是减少计数器的操作 decrement。下面是简单的实现:

-- -------------------- ---- -------
------ ---- ---- -------
------ --- ---- ------

-- ------ --- --- -
--------------

-- ---- ----------------------- - -------
----- ----- - -
  ------ -
--

----- --------- - -
  --------- ------- - -- -----
    --------------
  --
  --------- ------- - -- -----
    --------------
  -
--

----- ------- - -
  ---------- -- ------ -- -- - -- -- --- ----
    --------------------
  --
  ---------- -- ------ -- -- -
    --------------------
  -
--

----- ------- - -
  ------ ----- -- ----------- -- -------
--

-- ---- ---- --
----- ----- - --- ------------
  ------ -- ----
  ---------- -- ------
  -------- -- ----
  ------- -- -----
---

-- ---- ----- --
------ ------- ------

在安装和创建 Vuex 实例后,就可以在应用的任意组件中使用 this.$store 来调用状态管理中心进行数据操作:

这里的 getters 方法用来获取当前数据源 count 的值。

Vuex 中的存储状态

在 Vuex 的世界中,主要有两种状态:

  • Store 状态(存储状态):即 Vuex 中的 State,是 Vue 组件中 data 或 props 的替代品。所有存储在 Vuex 中的状态都应该是响应式的。
  • 组件状态:即 Vue 组件实例中的状态 dataprops 或者 computed

Vuex 的主要作用就是将应用程序中的状态提升到全局层面。

在 Vuex 中修改状态(mutations)

状态的可变性非常重要,在 Vuex 应用程序中,不能直接改变状态中的数据,而是通过修改 mutations 中的方法来改变 Vuex 中的状态。

Vuex 中的 mutations 有以下特点:

  • 显式接收 state:Vuex 中的 mutations 对象定义的方法应该显式接收 state,把它作为第一个参数。在 mutation 中修改状态的时候,最好是修改 state,而不是直接覆盖它。
  • 唯一可修改状态的地方:Vuex 中的 mutations 是唯一修改状态的地方,这使得代码变得更容易推导开发人员的共同意图,也更容易使用工具完整地跟踪变更记录。

在 Vuex 中提交 Mutation(Actions)

Mutation 操作是 Vuex 中修改状态最简单和推荐的方法,但是 Mutation 操作不能包含异步操作,包含异步操作必须使用 Actions 操作。 Vuex Actions 与 Mutation 不同的地方是:

1、Actions 函数接收一个 context 对象,该对象包含:

  • dispatch:Action 函数内部执行 dispatch,提交 Mutation。
  • commit:Action 函数内部执行 commit,提交 Mutation。
  • state:获取当前 Vuex 的 state。

2、Actions 特性使得你可以:

  • 包含异步操作。
  • 有条件地提交一个或多个 Mutation。
  • 以返回值响应操作结果。

在 Vuex 中获取 State(Getters)

Getter 就是按需从 store 中提取状态,当到达 store 状态的变化时,仅会重新计算被依赖的 Getter,而不是计算所有 Getter。

Getter 函数接收 state 作为第一个参数,并且每一个 getter 都会暴露一些计算属性的值。

Vuex 严格模式

严格模式是在开发过程中有效的一个功能。在应用程序运行时,任何对 store 状态的修改都应该通过 mutation 函数完成,如果不通过 mutation 函数完成状态的修改,那么 当开启严格模式后,将会抛出一个错误,有助于开发人员快速定位问题。

总结

通过本文,您已经了解了 Vuex 的使用方法,以及为什么可以在 Vue.js 应用程序中使用 Vuex。Vuex 管理着应用程序中的状态,这使我们更容易跟踪和管理 Vue.js 应用程序状态的变化和维护,同时也有助于更好地组织应用程序结构。随着你的熟练程度持续提高,你将能够有效地应用 Vuex 状态管理的各种知识,构建更加健壮和可靠的大型应用程序。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649bfa6348841e98948bdba7

纠错
反馈