REACT REDUX:更新深层嵌套对象中的值

2023-12-07

我正在尝试更新存储在深层嵌套对象中的值。它包含许多信息并且模式是固定的。我正在尝试复制对象,然后从输入返回具有更新值 onChange 的对象。但是,我无法成功正确复制完整树并返回更新的内容。

DEMO: https://codesandbox.io/s/4j7x8jlk9w

该对象看起来像:

content: {
    label: "Label",
    templates: [
      {
        name: "example",
        type: "the type",
        items: [
          {
            key: "key1",
            properties: {
              text: {
                label: "The Label 1",
                value: "The Value 1"
              },
              color: {
                label: "Color",
                value: "#123"
              }
            }
          },
          {
            key: "key2",
            properties: {
              text: {
                label: "The Label 2",
                value: "The Value 2"
              },
              color: {
                label: "Color",
                value: "#456"
              }
            }
          }
        ]
      }
    ]
  }

减速机:

case "UPDATE_VALUE":
      const content = state.content.templates[state.templateKey].items[
        state.itemKey
      ].properties.text.value =
        action.value;

      return { ...state, content };

    default:
      return state;
  }

组件:

import React, { PureComponent } from "react";
import { connect } from "react-redux";

import { updateValue } from "./actions";

class Page extends PureComponent {
  render() {
    const { content, templateKey, itemKey } = this.props;

    return (
      <div>
        <h1
          style={{
            color:
              content.templates[templateKey].items[itemKey].properties.color
                .value
          }}
        >
          {content.templates[templateKey].items[itemKey].properties.text.value}
        </h1>
        <input
          name={content.templates[templateKey].items[itemKey].key}
          value={
            content.templates[templateKey].items[itemKey].properties.text.value
          }
          onChange={e => this.props.updateValue(e.target.name, e.target.value)}
        />
      </div>
    );
  }
}

const mapStateToProps = state => ({
  content: state.content,
  templateKey: state.templateKey,
  itemKey: state.itemKey
});

const mapDispatchToProps = dispatch => ({
  updateValue: (key, value) => dispatch(updateValue(key, value))
});

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(Page);

对于这样的深层嵌套数据,您可以在树的每个深度使用扩展语法,直到到达您想要更改的内容。对于数组,您可以使用slice创建数组的副本而不改变它。

https://redux.js.org/recipes/structuringreducers/immutableupdatepatterns# Correct-approach-copying-all-levels-of-nested-data

and https://redux.js.org/recipes/structuringreducers/immutableupdatepatterns#inserting-and-removing-items-in-arrays

将提供资源来帮助您更好地理解这一点。

假设您的减速器获得了要更新的模板的索引,以及要在该模板中更新的项目的索引。您的代码可能如下所示:

return {
    ...state,
    templates: [
      ...state.templates.slice(0, templateIndex),
      {
        ...state.templates[templateIndex],
        items: [
          ...state.templates[templateIndex].items.slice(0, itemIndex),
          {
            ...state.templates[templateIndex].items[itemIndex],
            value: action.value 
          },
          ...state.templates[templateIndex].items.slice(itemIndex)
        ]
      },
      ...state.templates.slice(templateIndex)
    ]
  }

正如您所看到的,当您处理这样的嵌套数据时,它会变得非常混乱。建议您规范化嵌套数据,以使您的减速器只需做更少的工作即可找到要更改的内容。

这是您更新的代码和框:https://codesandbox.io/s/w77yz2nzl5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

REACT REDUX:更新深层嵌套对象中的值 的相关文章

随机推荐

  • 从 Android HTML 资源创建 SQLite 表

    我尝试在 android 中使用 HTML 在 sqlite 中创建一个表 但它不起作用 示例 HTML 在这里
  • C# 函数和可选参数

    我知道在 C 中可以定义可选参数 我的问题是这有多灵活 令 f 为如下函数 其中a强制性和b c选修的 class Test public void f int a int b 2 int c 3 现在 我知道我可以通过以下方式调用该函数
  • 如何使用 Swift 3 为按钮制作摇动动画 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一个每 3 秒调用一次的函数 我怎样才能制作一个晃动的动画button左右摇晃 func shakeButton if opened false Shake Animatio
  • VSCode 在片段中链接正则表达式转换

    我正在尝试通过两种方式在 VSCode 中自动转换文件名 假设我有test file name md 我想结束Test File Name在我的文档中 现在我可以分别完成转换的两个部分 但我正在努力寻找如何将它们组合起来 要删除所有 并将它
  • 当类型是映射的任何成员时提高 Typescript 速度?

    例如 我有这些类型 class User extends Entity class Post extends Entity type Entities user User post Post potentially hundreds mor
  • 如何将数据文件作为矩阵导入并从 python 脚本运行 .m 文件?

    我有一个 m 文件 用于在 matlab 中运行神经网络 该文件已本地安装在我的计算机上 我正在尝试编写一个 python 脚本 它将多次循环遍历神经网络可能的传输和训练 函数列表 我编写了一个函数来打开和编辑 m 文件 但我不知道如何操作
  • 从 .NET Windows 服务调用 COM 组件

    我有一个用 NET C 编写的 Windows 服务 它调用 COM 组件 我还有一个 NET Windows 窗体测试应用程序 用于测试 COM 组件 从测试应用程序来看它运行良好 但是 当我在 Windows 服务中使用相同的代码时 什
  • 检测 Bash“导出”值的失败

    在 Bash 中 我执行命令并将结果放入变量中 如下所示 export var svn ls 但是 如果 SVN 由于某种原因失败 例如它返回非零错误代码 则导出仍会返回状态代码 0 如何检测执行的命令是否失败 var svn ls if
  • 在 Ruby 中使用多个进程

    Ruby 是否有一个模块可以轻松地在多个进程之间共享对象 我正在寻找类似于Python的东西多重处理 它支持可以在进程之间共享的进程安全队列和管道 我认为您可以使用 Ruby IO 的功能做很多您想做的事情 你在进程之间共享 而不是线程之间
  • 在进行 Web 自动化时,如何使用空手道 DSL 与 Chrome 中的网络选项卡进行交互

    我正在使用空手道 DSL 编写 UI 自动化脚本 在这一点上 我需要从 Chrome 中的网络调用中获取价值 我想与 chrome devtools 网络选项卡中的 Web 服务调用之一进行交互 并获取该 Web 服务的 json 响应 我
  • 在 C# 中使用 P/Invoke 注册 _set_purecall_handler 函数

    我使用时遇到问题 set purecall handler使用 C 中的 P Invoke 基本上 这有效 C set purecall handler MyPureCallHandler void MyPureCallHandler vo
  • 输入被禁用,直到先前的输入被填充

    我想做的是 当用户登陆表单时 我希望第一个输入处于活动状态 以便用户能够单击 选择或填写它 我希望他们逐步填写表格 因此我希望只有在他们填写完当前输入后才激活下一个输入 我还希望禁用提交按钮 并且在填写所有输入之前不要激活提交按钮 实现这一
  • WPF 对齐容器中的项目

    所以我有这个简单的xaml
  • System.Double[*] 是什么意思

    这个 gem 是在我们反编译的一些互操作代码中创建的 我们不知道如何创建这个数组的实例 也不知道它是什么类型的数组 看着Type GetElementType告诉我它是一个类型数组Double 但我们无法弄清楚它与System Double
  • 限制对我网站上图像的访问,除非通过我自己的 html

    在我的网站上 我以简单的方式存储用户图片 例如 图像 user 1 jpg 我不希望访问者仅通过尝试 user ids 就能够查看我的服务器上的图像 例如 www mydomain com images user 2 jpg www myd
  • 如何序列化 JavaScript 关联数组?

    我需要序列化一个关联的 JavaScript 数组 这是产品和数值的简单形式 但在构建数组后似乎是空的 代码在这里 http jsbin com usupi6 4 edit 一般来说 不要将 JS 数组用于 关联数组 使用普通对象 var
  • 意外字符“@”您可能需要适当的加载程序来处理此文件类型

    这是我尝试运行 webpack 时得到的结果 我得到的错误是 v3 app styles main scss 中出现错误 模块解析失败 Users vovina widget login react v3 app styles main s
  • Torrent 客户端中的哈希计算

    我想知道是否有人知道 BitTorrent 客户端中的 哈希 指的是什么 它显然不是hash文件的代码 但有些不同 我认为这更像是一个文件的磁力链 接 但是它是如何连接到文件本身的呢 我只是想了解幕后的构造 torrent 客户端中的文件
  • 在 C++ (MFC) 资源文件中连接字符串和常量

    我有一个带有 MFC 的 C 项目和一个资源文件 在我的 关于 对话框中 我想添加一个包含程序版本的常量 IDD ABOUTBOX DIALOG DISCARDABLE 34 22 237 65 STYLE DS MODALFRAME WS
  • REACT REDUX:更新深层嵌套对象中的值

    我正在尝试更新存储在深层嵌套对象中的值 它包含许多信息并且模式是固定的 我正在尝试复制对象 然后从输入返回具有更新值 onChange 的对象 但是 我无法成功正确复制完整树并返回更新的内容 DEMO https codesandbox i