Vue.js:使用 Vuex 实现组件间数据共享的方法

阅读时长 9 分钟读完

随着前端单页面应用(SPA)的日益普及,组件化开发已经成为前端开发的趋势。但是,当我们需要组件之间共享数据时,不同组件之间的通信成为了一个问题。

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它可以让我们更加清晰地组织代码,使得多个组件可以共享同一个状态,并且在状态变化时也可以自动更新组件。

下面,我们来学习一下如何使用 Vuex 实现组件间的数据共享。

安装和使用 Vuex

在使用 Vuex 之前,我们需要先安装它。可以通过 npm 或 yarn 进行安装:

或者

安装完成之后,我们需要在 Vue 实例中引入 Vuex:

创建一个 Vuex store

在使用 Vuex 之前,我们需要先创建一个 Vuex store。在 store 中存储着我们的应用程序中所有需要共享的状态。

我们可以通过传递一个对象来创建一个 Vuex store。对象中包含了 state、getters、mutations 和 actions 四个属性。下面我们分别解释一下这四个属性:

  • state:存储着我们的应用程序中需要共享的状态。

  • getters:从 state 中派生出一些状态。主要用于对 store 中的状态进行过滤、计算和处理,并返回结果。

  • mutations:用于修改 state 中的状态。只能通过调用 mutations 中的函数来修改 state 中的状态,且必须是同步操作。

  • actions:用于触发 mutations 中的函数,并且可以包含任意异步操作。

下面是一个简单的 Vuex store 示例:

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

在组件中使用 Vuex

在组件中使用 Vuex 需要使用“辅助函数”来引入状态,这些辅助函数可以帮助我们更方便地获取 state 中的状态、触发 mutations 中的函数以及派发 actions 中的函数。

  • mapState:将 state 中的状态映射为计算属性;

  • mapGetters:将 getters 中的状态映射为计算属性;

  • mapMutations:将 mutations 中的函数映射为 methods;

  • mapActions:将 actions 中的函数映射为 methods。

下面是一个使用 mapState 和 mapMutations 辅助函数的例子:

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

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

其中,mapState 辅助函数中传入一个数组,数组中每个元素是一个字符串,表示映射到计算属性中的名称。mapMutations 辅助函数中传入一个数组,数组中每个元素是一个字符串,表示映射到 methods 中的名称。

使用 Vuex 实现组件间数据共享

在一个 Vue.js 应用程序中,当一个组件拥有一些需要共享的状态时,可以通过将这些状态保存在 Vuex store 中,并且将对 store 的修改、查询、删除等操作通知到 store 中去,从而实现多个组件之间的共享访问。

下面,我们通过一个购物车案例来演示如何使用 Vuex 实现组件间数据共享的方法。

设计 store 中的 state

在购物车案例中,我们需要存储购物车中的商品,以及计算购物车总价、总数量等信息。所以,我们可以将 store 中的 state 设计如下:

实现添加商品至购物车

在购物车页面中,用户可以将物品添加至购物车,并且每添加一个商品,我们需要将其保存到 store 中,并且计算购物车中的总件数和总价格。下面是实现方法:

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

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

当用户点击添加购物车时,页面需要派发 addCart 函数,这个函数触发了 mutations 中的 addCart 函数。在 addCart 函数中,我们首先查找购物车中是否已经存在该商品,如果存在,只需要让该商品数量加一即可;如果不存在,我们要将商品添加到 store 的 cartList 中,并且设置 count 为 1,checked 为 true。

在购物车页面中读取购物车商品数量和商品列表

在购物车页面,我们需要读取购物车中商品的列表和数量,以及计算总价格。可以通过 mapState 和 mapGetters 辅助函数来实现。下面是实现方法:

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

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

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

在计算购物车商品数量的 mapGetters 中,我们通过传入一个数组,数组中包含了映射的名称,这些名称可以实现在计算属性中获取。

在获取购物车中商品数量和购物车商品列表的 mapState 中,我们同样将需要映射的名称通过数组方式传递给 mapState,这些名称被映射为计算属性。

实现购物车全选、反选和删除商品的功能

在购物车页面中,用户可以全选、反选和删除商品。这些操作需要操作 cartList 中的某个商品的 checked 属性,并且更新 store 中的总价格和 count。

为了方便实现,在 store 中,我们可以定义两个计算属性,分别计算购物车中已选择和未选择的商品总数。

下面是 mapActions 和 mapGetters 实现购物车全选、反选和删除商品的功能:

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

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

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

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

在通过 mapActions 获取购物车中已选择和未选择商品数量时,我们同样需要传入一个数组参数,数组中包含了需要获取的状态的名称。mapActions 将这些名称映射为 methods 来进行使用。

总结

通过本文,我们学习了如何使用 Vuex 实现组件间数据共享的方法,我们了解了 Vuex 的核心概念和基本用法,学会了如何在 Vuex 中定义 state、getters、mutations 和 actions,以及在组件中使用 mapState、mapGetter、mapMutations 和 mapActions 等辅助函数来实现对 store 中的状态进行修改和获取。

在实践中,使用 Vuex 可以帮助我们更好地组织代码,并且让多个组件之间可以共享同一个状态,同时将状态的修改、查询、删除等操作通知到 store 中,简化了组件之间的通信逻辑,确保了应用程序的可维护性和可扩展性。

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

纠错
反馈