Redux 核心原理解析及实战应用

阅读时长 10 分钟读完

前言

Redux 是一种 JavaScript 状态管理器,适用于大型应用程序中的数据流控制。它是 React 的常用工具之一,但它并不限于 React 或任何特定的视图库/框架。本文将介绍 Redux 的核心原理,解释它如何工作并展示如何在实际应用中使用。

Redux 原理

Redux 的核心原则是单一状态树。它主要由纯简单的函数组成,它们分别被称为 reducers。所有应用程序状态都存储在单个对象中,称为 state。Redux 应用程序的视图与状态高度合乎逻辑,而应用程序的状态又是不可变的。

Redux 采用一种非常简单的方式来实现这一原则。它使用 action,一个表示发生了什么的简单对象,增加可预测性。通过将 action 发送到 reducer,我们提出了应用程序状态变化的想法。

Action

action 是简单的 JavaScript 对象,它至少有一个 type 属性,用于描述正在发生的事情。它可能包含了其他的数据,称为 payload。payload 是有意义的内容,它有助于更好地描述 action 的意图。

Redux 官方推荐将 type 属性定义为字符串常量,以确保代码的一致性和错误检测。将它们定义成常量有一个额外的好处,开发者可以轻松地在应用程序中搜索所有用于这种类型的 action。

Reducer

reducer 接收当前状态和一个 action,然后返回一个新状态。reducer 必须是一个纯函数。

一个纯函数的特点是,对于一个给定的输入,它总是返回相同的输出,且不产生任何副作用。这样保证了状态不可变性。

在 Redux 中,reducer 是一个接收两个参数并返回一个新状态的纯函数。

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

Store

store 是将 state、action 和 reducer 结合在一起的容器。store 让我们可以在应用程序中访问 state,dispatch action 并注册监听器以监听 state 的变化。

在 Redux 中,我们使用 createStore 来创建 store。

Dispatch

使用 store.dispatch() 方法来分派一个 action 到 store 中。dispatch() 方法传递一个包含 type 属性的简单 JavaScript 对象。

Subscribe

使用 store.subscribe() 方法注册监听器,当 state 发生变化时更新 UI。所以,每次分派 action 后,必须调用 getState() 方法,以便在应用程序中更新 store。

dispatch() 和 subscribe() 后面会在示例代码中使用到。

Redux 实战应用

安装

使用 npm 或 yarn 安装 Redux。

创建一个 reducer

我们用一个示例 todos 应用程序来说明如何使用 Redux。

首先创建一个 todosReducer,它处理增加或删除 todo 的 action。

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

创建一个 store

创建 Redux store 并将 todosReducer 和初始状态作为参数传入。

分派 action

现在我们可以开始 dispatch action 了。我们使用新的 addTodo 函数来创建 ADD_TODO action。该函数本身应该返回一个简单的包含 type 和 payload 的 JavaScript 对象。

我们可以看到,这里使用了 store.dispatch() 方法来分发一个包含 action 数据的对象。

监听 state 变更

现在我们添加一个数据监听器,每次 state 更改都会执行回调函数。在回调函数中,我们调用 getState() 方法获取当前 state,并更改 UI。我们在下面的示例中使用 subscribe() 方法来添加此数据监听器。每次 state 更改后我们会重新渲染列表。

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

删减 todo

最后,我们创建一个从 state 中删除 todo 的函数,并使用 removeTodo 来发布 REMOVE_TODO action。

这里我们再次使用 store.dispatch() 方法来分发一个包含 action 数据的对象。

完整示例代码:

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

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

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

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

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

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

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

最终效果是,可以在 UI 中添加和删除 todo。每次 state 更改时,我们都会用一个更新后的状态重新渲染 UI。

结论

Redux 的核心原理是非常简单的,它提供一种在应用程序中管理状态的方法。通过 reducer 控制状态的变化,而 action 触发状态变化。商店本身是整个应用程序的一个容器,并允许我们访问、更新和监听整个应用程序的状态。在实际应用中,Redux 可以让我们更容易地管理大型应用程序的状态,并保证 state 的不可变性。

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

纠错
反馈