npm 包 redux-normalizr 使用教程

阅读时长 9 分钟读完

Redux 是一种状态管理库,旨在使 Web 应用程序的状态管理更加可控和可维护。redux-normalizr 是一个基于 Normalizr 的 Redux 数据库规范化器,用于简化挂钩 Redux 应用程序状态的处理器的操作。本文将为您介绍操作 redux-normalizr 的详细指南,协助您实现更轻松,可读性更高的 Redux 应用程序。

安装

使用 npm 安装:

npm install redux-normalizr

然后使用 import 引入:

import normalize from 'redux-normalizr'

如何使用 redux-normalizr

redux-normalizr 使基于 Normalizr 的 Redux 数据规范化器变得容易,它支持三个函数:

  • normalize
  • denormalize
  • schema

本文将依次介绍这些函数的使用。

normalize()

normalize() 函数用于规范化嵌套的对象和数组,使它们更容易用于 Redux 状态管理。

例如,您可能有一个包含客户端和订单的数据:

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

您可以使用 normalize() 函数将此数据规范化,将相关实体分组并创建一个新的“entyities”对象。此对象包含每个对象的 id,并将每个实体映射到该实体的 ID。

在上面的示例中,entities 对象看起来像这样:

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

这将使您可以轻松查找所有客户端或订单。例如,要查找第一个客户端的所有订单,您可以使用以下代码:

denormalize()

denormalize() 函数用于将规范化的对象重新映射到数据结构。

例如,如果您拥有上述客户端和订单的 entities 对象和一个 result 数组:

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

您可以使用 denormalize() 函数轻松地重新组合数据,如下所示:

schema()

每个对象都需要标识属性,以区分不同对象。redux-normalizr 使用 schema 为每个对象定义一个“严格”结构。下面是一个客户端架构的例子:

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

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

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

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

此模式定义一个客户端模式('clients'),该模式由一个简单的客户端模式提供。对于每个实体,可以通过定义一个谷物来自定义其行为。在这种情况下,我们只需指定客户端对象的 idAttribute 属性即可。

例子

现在您已经了解了如何使用 redux-normalizr,我们来看一个完整的示例。在此示例中,我们使用 redux-normalizr,Asynchronous libraries(thunk)和 React 来构建一个简单的带有后端的 book club 应用程序。

首先,我们需要从我们的 API 获取俱乐部和书籍数据。我们将使用 thunk 来调用 API 并将数据规范化:

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

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

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

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

上面的代码使用异步 Aciton Creator(thunk)来调用 API 并将数据规范化。

然后,我们需要在 reducers.js 中更新两个 reducer,以便处理由 fetchClubs 和 fetchBooks 发送到 redux store 的数据:

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

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

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

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

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

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

这里的 reducer 将数据直接存储到 Redux store 中,以便稍后使用。

假设我们有一个 Book 部件,此部件包含在库中提供的所有书籍元素的特定视图。在此组件中,我们可以使用 selectBooks 函数来选择我们所需的书籍:

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

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

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

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

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

我们使用 createSelector 函数从 Redux store 中选择所有书籍,然后使用 react-redux 中的 connect 函数将选择的书籍作为 props 传递给组件。

作者通过介绍 redux-normalizr 的使用方法,结合 React 和 redux,构建了一个简单的带有后端的 book club 应用程序,来帮助我们更好的管理数据。当您编写 Redux 应用程序时,从环境细节中抽象出数据很重要,而 redux-normalizr 帮助简化和加速这一过程。

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

纠错
反馈