如何使用 normalizr 向 Redux Store 添加/删除数据

Redux 是一个流行的 JavaScript 应用程序状态管理库,而 Normalizr 又是 Redux 生态系统中广泛使用的工具,它可以帮助你规范化嵌套的 JSON 数据对象。在这篇文章中,我们将学习如何使用 Normalizr 来操作 Redux Store 中的数据。

什么是 Normalizr?

Normalizr 是一个可以将复杂的嵌套 JSON 对象规范化为扁平的实体(entities)结构的库。这个库提供了一种方便的方式来定义数据模型,并且可以自动将嵌套的数据对象转换为扁平的实体结构。例如:

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

可以被规范化为下面这个对象:

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

在这个扁平化的实体结构中,每个实体都有一个唯一的标识符,并且其他实体可以通过引用这些标识符来相互关联。这种扁平化的结构可以方便地在 Redux Store 中使用。

使用 Normalizr 创建 Redux Store

首先,我们将使用 Normalizr 来创建一个简单的数据模型,并且使用它来初始化我们的 Redux Store。我们的数据模型将代表一个帖子(Post),每个帖子都有一个唯一的 ID、标题和正文。我们还将为每个帖子添加一个标签(Tag)列表,每个标签也有一个唯一的 ID 和名称。下面是我们的数据模型定义:

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

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

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

在上面的代码中,我们创建了两个实体模式:posttagpost 实体包括一个名为 tags 的属性,它的值是一个标签数组。每个标签都是 tag 实体的一个实例。

现在,我们需要使用这些实体模式来初始化我们的 Redux Store。我们将使用 normalizr 库中的 normalize 函数来规范化数据并将其存储在 Redux Store 中。下面是初始化 Redux Store 的代码:

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

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

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

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

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

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

猜你喜欢

  • Javascript 动态字符串数组

    在前端开发中,经常需要操作字符串数组。Javascript 提供了方便的语法和 API 来处理这些数组。本文将介绍如何创建和操作动态字符串数组,并提供示例代码。 创建动态字符串数组 在 Javascr...

    7 年前
  • 使用 ReactJS 实现 Facebook API 登录

    在现代 web 应用程序中,使用第三方身份验证是很常见的。Facebook API 提供了一种简单的方式实现用户登录。本文将介绍如何使用 ReactJS 和 Facebook API 来实现一个基本的...

    7 年前
  • JavaScript中如何对字符串进行随机排序?

    在JavaScript中,有时需要对字符串进行随机排序。比如,在制作单词游戏或密码生成器时,需要将字符串中的字符打乱顺序。 要实现这个功能,可以使用JavaScript中的数组和字符串方法。

    7 年前
  • Vanilla JavaScript 替代 jQuery .click 方法

    在前端开发中,jQuery 是一个广泛使用的 JavaScript 库,它提供了很多实用的方法,其中 .click() 方法可以用于在 DOM 元素上添加点击事件监听器。

    7 年前
  • 从子页面获取父页面的 URL - iframe

    在前端开发中,我们经常会使用 iframe 元素来嵌入其他网页或应用程序。但是,当需要在 iframe 内部执行某些操作时,通常需要访问包含 iframe 的父级页面(也称为宿主页面)的属性或方法。

    7 年前
  • 如何将 HTML 代码块赋值给 JavaScript 变量

    在前端开发中,我们有时需要将 HTML 代码块赋值给 JavaScript 变量。这在处理模板、动态渲染等场景中非常实用。那么该如何实现呢?本文将详细介绍两种方法,并附带示例代码,旨在为读者提供深入学...

    7 年前
  • FontAwesome 无法在本地和 Electron 应用中加载字体的解决方案

    FontAwesome 是一款广泛使用的图标字体库,但是在某些情况下可能会无法正常加载。本文将探讨 FontAwesome 无法在本地和 Electron 应用中加载字体的原因,并提供解决方案。

    7 年前
  • Bootstrap 3 btn-group 在页面任意位置点击后丢失 Active Class

    在使用 Bootstrap 3 的 btn-group 组件时,我们可能会遇到一个问题:当点击页面上其它区域时,已处于 active 状态的按钮会失去 active class,导致用户无法明确当前选...

    7 年前
  • 使用 Mongoose 的 .populate() 方法返回指定字段

    在使用 Mongoose 进行 MongoDB 数据库操作时,我们经常需要加载关联的模型数据。为了避免多次查询,可以使用 .populate() 方法来一次性加载所有相关联的文档。

    7 年前
  • 在React Router中如何将默认路由设置为另一个路由

    React Router是React中最常用的路由库之一,它允许开发人员构建具有多个页面的单页应用程序。在React Router中,默认路由是指在URL路径不匹配任何其他路由时显示的页面。

    7 年前
  • Swap key with value JSON

    在前端开发中,经常需要对 JSON 数据进行操作和转换。有时候我们需要交换 JSON 对象的键和值。比如我们有一个示例数据: - ------- -------- ------ --- -...

    7 年前
  • jQuery表单反序列化

    在前端开发中,我们经常需要使用表单来收集用户输入的数据。这些数据需要在后续的处理中被反序列化为一个JavaScript对象以方便操作。jQuery提供了一种简单而强大的方式来实现表单数据的反序列化。

    7 年前
  • Case insensitive replace all

    在前端开发中,我们常常需要对文本进行替换操作。如果要忽略大小写进行替换,该怎么办呢?本文介绍一种实现方法:Case insensitive replace all。

    7 年前
  • 如何使用 Handlebars.js 将字段转换为小写?

    Handlebars.js 是一个流行的 JavaScript 模板引擎,它允许您生成 HTML 标记和文本。在 Handlebars 中,您可以访问并处理模板中传递的数据对象。

    7 年前
  • 使用jQuery animate() 实现margin-top动画效果

    在前端开发中,实现动态效果的交互是必不可少的。jQuery animate() 方法是其中非常重要的一个函数,可以通过它来实现很多有趣的动画效果。本文将会介绍如何使用jQuery animate()方...

    7 年前
  • 动态地移除日期选择器功能

    在前端开发中,我们经常需要使用日期选择器控件来帮助用户选择日期。但有时候我们可能需要动态地移除这个功能,比如根据用户的特定需求或者页面状态。 为什么要移除日期选择器功能? 有以下几种情况可能会导致我们...

    7 年前
  • 如何在 JavaScript 中从字符串中提取数字

    当我们需要从一个字符串中获取数字时,我们可以使用不同的技术和方法。在这篇文章中,我将介绍一些用于在 JavaScript 中从字符串中提取数字的有效方法。 方法一:使用正则表达式 正则表达式是一种强大...

    7 年前
  • 如何在网页中嵌入 YouTube 视频后去除品牌标识?

    在网站中嵌入 YouTube 视频是非常常见的前端开发需求,但是默认情况下,视频播放器会带有 YouTube 的品牌标识,这可能对一些网站来说并不理想。本文将介绍如何去除嵌入的 YouTube 视频品...

    7 年前
  • Youtube iFrame API not triggering onYouTubeIframeAPIReady

    问题描述 使用Youtube iFrame API的开发者可能会在加载API时遇到onYouTubeIframeAPIReady事件没有触发的问题。这个问题可能会导致后续的视频播放代码无法正常运行。

    7 年前
  • Boolean 转整数的几种方法

    在前端开发中,我们有时需要将布尔值转换为整数。比如,我们可能需要将 true 转换为 1,false 转换为 0。这篇文章将介绍几种实现方式。 方法一:使用 Number() 函数 ----- ---...

    7 年前

相关推荐

    暂无文章