Redux 中的 action、reducer、store 详解

阅读时长 6 分钟读完

Redux 中的 action、reducer、store 详解

Redux 是一个用于 JavaScript 应用的可预测状态容器。它有三个重要的概念:actionreducerstore。本文将详细讲解这三个概念,以帮助读者更深入理解 Redux 的工作原理,从而更好的使用 Redux。

action

action 是 Redux 中改变状态的唯一途径。它是一个普通的 JavaScript 对象,其中必须包含一个 type 字段,用于描述本次状态改变的类型。另外,payload 字段可选,用于携带本次状态改变所需的数据。通常会使用一个函数来创建 action,称为 action creator。例如:

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

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

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

上面代码中,定义了两种 action type,分别对应添加和完成一个任务的操作。接着定义了两个 action creator 函数,分别用于创建不同类型的 actionaddTodoActiontoggleTodoAction 函数都是一个纯函数,它们只是负责返回一个标准的 action 对象。

reducer

reducer 负责处理 action,并修改应用的状态。Reducer 是一个纯函数,它接收当前的状态和处理 action 后得到的新状态,然后返回一个新的状态。Reducer 需要保证它是纯函数,也就是只依赖于输入,不会影响到外部的状态。

下面是一个示例:

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

上面代码中,todoReducer 是一个纯函数,它接收一个状态和一个 action 对象,它的作用就是根据传进来的 action 对象来修改当前的状态。它首先判断 action 的类型,如果是 ADD_TODO,则返回一个新的数组,并将传递来的数据展开到新数组中。接着,如果是 TOGGLE_TODO,则返回一个新的数组,并使用 map 方法来处理每一个任务的状态。注意,每当 reducer 修改状态时,都需要返回一个全新的状态,而不是在原有状态上进行修改。

store

store 是 Redux 中唯一的管理者,它维护应用的状态,负责接收 action 并派发给 reducer。在创建 store 时,需要将 reducer 传入 createStore 方法:

store 创建后,就可以对状态进行访问和修改。我们可以用 getState() 方法来获取应用的当前状态,用 dispatch(action) 方法来派发 action。例如:

当派发一个 action 时,store 首先会将它传递给 reducer,让 reducer 处理这个 action,并返回一个新的状态。store 会自动将这个新状态更新到自己维护的状态中。Redux 规定,当一个 action 被派发到 store 后,所有的 reducer 都会收到这个 action,并有机会处理它。由于每个 reducer 只处理状态树的一部分,所以应该把状态分解成多个部分,每个部分由自己的 reducer 处理,最后将它们合并成一个完整的状态树。

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

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

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

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

上面代码中,userReducertodoReducer 是两个不同的 reducer 函数,分别处理用户信息和任务列表。通过 combineReducers 全局将这两个 reducer 合并成一个状态树。最后,我们用 createStore 来创建 store

总结

Redux 中的 actionreducerstore 是实现状态管理的三个重要概念。action 是定义操作的纯对象,reducer 是根据 action 修改状态的纯函数,store 负责整个应用的状态管理。了解这三个概念是使用 Redux 的前提,只有深入掌握它们的工作原理,才能更好的使用 Redux。

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

纠错
反馈