Redux 重构 Vue.js 应用

阅读时长 7 分钟读完

随着前端应用的复杂度不断提高,单纯的 Vue.js 组件管理已经不能满足实际需求。而 Redux 作为一个广受欢迎的状态管理库,可以很好地解决这个问题。在本文中,我们将介绍如何用 Redux 重构 Vue.js 应用。

Redux 简介

Redux 是一个状态管理库,它可以帮助我们更好地管理组件之间的数据流。它的核心思想是将状态从组件中分离出来,以一个单独的 store 来存储和管理所有状态,然后通过 action 来触发 state 的变化,最终更新 UI。

在应用中使用 Redux,需要遵循以下几个步骤:

  1. 定义 action:描述发生了什么,例如添加一个待办事项;
  2. 定义 reducer:将 action 和当前的状态合并,生成新的状态;
  3. 创建 store:将 reducer 和初始状态组合在一起,创建一个 store;
  4. 在组件中使用 state 以及 dispatch。

Vue.js 应用的状态管理

Vue.js 应用默认使用的状态管理方式是通过组件之间传递 props 和 $emit 来管理状态流。虽然这种方式在简单的情况下足以胜任,但是当组件层级比较深或者状态复杂时,就变得比较麻烦。

下面是一个简单的 Vue.js TodoList 组件:

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

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

这个组件的状态包括:

  • todos:待办事项数组;
  • newTodoContent:输入框中的值。

在这个组件中,我们通过通过在 data 中定义 todos 和 newTodoContent 来存储状态,然后在方法中通过 this.todos 和 this.newTodoContent 来使用。这种方式在简单的情况下还可接受,但是当状态复杂时会变得很不直观,而且不易维护。

Redux 重构

按照 Redux 的思路,我们可以将状态从组件中抽离出来,然后用 Redux 管理。首先,我们需要安装 Redux:

然后定义 action 和 reducer。

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

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

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

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

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

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

在 actions.js 中,我们定义了两个 action:ADD_TODO 和 DELETE_TODO。

在 reducers.js 中,我们定义了一个 reducer 以及初始状态。在 reducer 中,根据 action 的类型来更新状态。

接下来,我们需要创建 store,并在组件中使用它。

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

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

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

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

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

上面的代码中,我们创建了一个 store,并使用 mapState 和 mapActions 来映射状态和 action。

同时,我们在组件中去除了原来的 data 和 methods 属性,它们将被 store 和 action 取代。

最后,我们需要修改组件的代码,以便使用 Redux 管理状态。

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

在组件加载时,我们通过 store.subscribe 方法监听状态的变化,并重新更新组件中的 todos。

总结

通过将状态从组件中抽离出来,我们可以使用 Redux 更好地管理组件之间的数据流。在本文中,我们通过一个简单的 TodoList 应用演示了如何使用 Redux 重构 Vue.js 应用。通过上述步骤,我们可以更好地分离关注点,提高代码的复用性和可维护性。

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

纠错
反馈