从redux中的reducer获取ID

2024-03-29

我是个新手,正在尝试使用 React 和 Redux 构建一个简单的书签应用程序。

我无法解决这个问题:

用户可以创建一个书签并将其添加到多个文件夹。所以我派了一个addMark(bookmark)行动,然后addMark(folder) or editFolder(folder)如果该文件夹已存在。正如您所看到的,书签和文件夹是通过相同的操作添加的,因为在我的状态树中它们都只是marks- 通过其类型属性来区分。

我的问题:如何告诉文件夹对象哪个是要添加到书签文件夹列表中的新书签?如何检索两个调度之间新创建的书签的 ID?

我觉得不满意的解决方案:

  1. 我知道书签 ID 是如何在减速器中生成的(通过Math.max覆盖现有的书签 ID),这样我就可以在两个调度之间重现新的书签 ID。这听起来像是一个糟糕的黑客。
  2. 书签和文件夹保存在同一个状态分支(相同的减速器)中,因为它们都只是“标记”,我可以有一个引用最新添加的书签的状态属性,但这听起来也像是一个糟糕的黑客。

一些源代码,以了解我所拥有的:

// mapping between dispatcher and props to my react view
const mapDispatchToProps = (dispatch) => ({
  saveMark: (mark) => {
    if (mark.id) {
      dispatch(editMark(mark));
    } else {
      dispatch(addMark(mark));
    }
  },
});
export default connect(mapStateToProps, mapDispatchToProps)(AddMark);

在 AddMark 内部,它是容器组件:

// save the bookmark first
this.props.saveMark({
      type: 'bookmark',
      title: this.state.title,
      url: this.state.url,
      icon: this.props.icon,
      style: this.state.style,
 });
 // now I need the bookmark ID
 folders.forEach(folder => {
    folder.children.push(bookmarkID) // <-- !!!
 });
 folders.forEach(folder => this.props.saveMark(folder));

我对此找不到满意的解决方案。


我认为你应该在这里只发送一个操作:addBookmark(),它接受书签对象和文件夹。

您处理将书签对象添加到文件夹的代码应该是减速器的一部分。

另外,请参考待办事项示例 https://github.com/reactjs/redux/blob/master/examples/todos/actions/index.js在 Redux 项目中。它在创建动作时提供了 id,以便可以在组件中读取它。您还可以使用当前状态来计算最新的 id:

function addBookmark(bookmark, folder) {
   return (dispatch, getState) => {
       const newBookmark = Object.assign({
         id: Math.max(0, ...getState().bookmarks.map(b => b.id)) + 1,
       }, bookmark);
       dispatch({
         type: 'ADD_BOOKMARK',
         bookmark: newBookmark,
         folder: folder
       });
   }
}

请注意,该示例需要redux-thunk https://github.com/gaearon/redux-thunk调度这些操作的中间件。

然后您可以在文件夹缩减器中访问带有 id 的书签

function folderReducer(state = [], action) {
  if(action.type === 'ADD_BOOKMARK') {
     return state.map(folder => {
       if(folder === action.folder) {
         return Object.assign({}, folder, {children: [...folder.children, action.bookmark.id]}
       }
       return folder;
     })
  }
  //another reducer code
  return state;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从redux中的reducer获取ID 的相关文章

  • 角度指令可以将参数传递给指令属性中指定的表达式中的函数吗?

    我有一个使用指定的表单指令callback具有隔离范围的属性 scope callback 它位于一个ng repeat所以我传入的表达式包括id对象作为回调函数的参数
  • 每个对象? [复制]

    这个问题在这里已经有答案了 我在 JavaScript 中有对象 var object someobject Object aaa true bbb true ccc true 我该如何使用每一个呢 object each function
  • 在一段时间内切换(或闪烁)表中的特定单元格

    我已经在 Html 中创建了一个表格 我想让一个特定的单元格闪烁 打开和关闭 您能否让我知道是否可以使用 javascript h4 Two rows and three columns h4 table border 1 width 10
  • Safari 在后台选项卡中延迟 setInterval / setTimeout(间隔 > 1000ms)

    请注意 当页面位于后台选项卡中时 Safari 10 0 3 会延迟我的代码 var interval 2000 var scriptTime new Date getTime function addTime scriptTime int
  • res.cookie未在浏览器中设置cookie

    我目前正在尝试使用 React 客户端设置 Node Express 应用程序以与之交互 我设置了护照来处理 JWT 身份验证 当用户登录时 我验证电子邮件 密码 然后我设置cookie res cookie jwt token httpO
  • 如何解释这个正则表达式 /[\W_]/g

    我的代码是 var result2 result replace W g replace replace 该代码有效 我得到了我需要完成的工作 但我不明白正则表达式如何 W g有效 但我找不到任何我理解的文档 g这是一个全局正则表达式 因此
  • Node JS 如何将图像和请求数据一起 POST 到另一个服务器/api

    我正在尝试将图像从 Node JS 应用程序发布到另一个 REST API 我在 Mongo DB 中有图像 作为二进制数组数据 由 Node JS 读取 然后应该发布到另一个 API 我面临的问题是如何将请求数据与图像一起发送 我有这个原
  • 使用 window.print 内容将网页下载为 pdf

    我想要一个链接 当单击该链接时 会自动开始下载网页的可打印版本 我正在使用Moodle 我想要的内容是完全相同的如果我使用 ctrl p 下载页面并保存为 pdf 或使用 a href Download web page a 我正是想要该内
  • 在主干/下划线模板中使用循环

    我有一个backbone js underscore js 模板 我将其输入到主干视图中进行渲染 视图传递一个包含数组的模型posts对象 我称之为post在模板中 Problem 当我尝试循环遍历数组的所有元素时posts 我收到一个错误
  • Vue - 如何附加组件?

    我正在尝试创建一个按钮 一旦按下该按钮 就会向我的组件添加一个子组件 我的代码可以工作 只是 HTML 被解析为字符串 这是父组件
  • 在我自己的文件夹结构中的 Sequelize 中的迁移

    我是新来的Sequelize我当前的项目要求我将它与迁移一起使用 我熟悉迁移的内容和方式 我来自Django背景 每个子应用程序在同一文件夹中都有模态 视图 api url 和迁移 我喜欢这个结构 并希望在我的 Nodejs 应用程序中保持
  • 将颜色渐变应用于网格上的材质 - Three.js

    我有一个 STL 文件加载到我的场景中 并将单一颜色应用于 phong 材质 我想要一种方法 将两种颜色应用于该网格物体的材质 并在 Z 轴上应用渐变效果 如下例所示 渐变花瓶 https i stack imgur com Ty9gq j
  • 如何重载材质 Switch 组件 css

    我正在尝试重载 MuiSwitch track 类开关 但它不起作用 基本上我想重载特定开关 我尝试使用 global MuiSwitch track backgroundColor d80c0a 但它使所有开关超载 有什么办法可以对单个开
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • 如何在android中使用webview明智地显示Html内容页面?

    您好 我创建了一个简单的应用程序来在 webview 中显示 html 页面 我使用 webview 并显示页面加载时间 如下所示 此后禁用滚动并使用下一个和上一个按钮来后退和前进包含 所以我的代码如下 首先onCreate显示添加webv
  • 在 AngularJS 中使用 iFrame

    Using Angular 1 2 我正在尝试找出一种 有角度 的方式来加载 iFrame 但我在任何地方都找不到任何教程 任何真正的讨论 基本上 我有一个显示链接列表的搜索页面 单击链接应调用控制器中的一个函数 该函数将数据 可能通过 h
  • 有没有办法向 JavaScript 对象添加元数据?

    我想将元数据的键值对添加到任意 JavaScript 对象 此元数据不应影响不知道元数据的代码 这意味着例如 JSON stringify obj JSON stringify obj WithMetaData key value 元数据感
  • 如何使用 Chart.js 在堆积条形图中显示内联值?

    我正在使用 Chart js 库在堆叠条形图中显示一些值 但我正在努力找出如何显示条形图中的值 即 现在 我有以下代码 可以在条形顶部显示数字 但我想知道如何在条形内部显示它们 var numberWithCommas function x
  • Firefox 中的代理设置不会“粘连”

    在家里我们有一个代理服务器 在工作中我们不会 Firefox 在这方面令人恼火 每当我启动它时 它都会默认使用代理服务器 如果我执行 工具 gt 选项 gt 设置 并选择 无代理 则没有问题 但是 如果我关闭 Firefox 并重新启动它
  • jQuery mobile 在 Opera Mini 浏览器中失败。如何获得错误输出?

    I have a jQuery Mobile http en wikipedia org wiki JQuery Mobile website that works great on normal browsers but it fails

随机推荐

  • C# 字段命名指南?

    我将自己编写一些 C 代码 但我想确保遵循最广泛接受的命名约定 以防我想引入其他开发人员 发布我的代码或出售我的代码 现在我遵循微软设定的命名约定 因为它们似乎是最广泛接受的 他们没有提到的一件事是私有字段的命名 在大多数情况下 我看到它们
  • FindNextFile 在 64 位 Windows 上失败?

    使用 C Builder 2007 FindFirstFile 和 FindNextFile 函数似乎无法在 64 位版本的 Vista 和 XP 上找到某些文件 我的测试应用程序是 32 位的 如果我使用它们遍历文件夹 C Windows
  • 任意金额、任意时间的定期付款?

    我们希望找到一个支付提供商 可以让我们做类似于 Hailo 的事情 即 用户注册并向我们提供他们的信用卡详细信息 授权我们向他们的帐户收费 他们只需要这样做once 在 Hailo 的例子中 用户可以随时乘坐出租车并收取任意金额的费用 在合
  • 通过 emacs shell 进行 ssh 吗?

    我想知道是否有人通过 emacs shell 使用 ssh 我能够连接到远程计算机 但无法使用 emacs 文件名 打开文件以使用 emacs 查看 编辑 因为 终端类型 哑 不足以运行 emacs 通常 emacs 会在控制台中打开 通过
  • 尚不支持运算符重载?

    根据 Swift 编程指南 运算符重载是允许的 而且实际上非常通用 但是 我无法让它在操场上工作 例如 Equatable协议想要这样 func lhs Self rhs Self gt Bool 假设我做了一个简单的Location3D
  • VS Code:“isort 服务器在过去 3 分钟内崩溃了 5 次......”

    我可能弄乱了一些环境路径变量 我一边学习 Django 和虚拟环境 一边修改 VS Code 并更改了 Python 安装的目录路径 在弄清楚如何指向 VS Code 的默认 Python 路径时 我删除了一些用户路径变量 然后 伊索开始拒
  • 如何在 google colab 中运行 matlab .m 文件

    我目前正在尝试运行这个存储库https github com Fanziapril mvfnet https github com Fanziapril mvfnet这需要一个步骤 Run the Matlab ModelGeneratio
  • 已确认设计在最新版本中不起作用

    我最近从 Devise 1 2 升级到 1 4 9 除了我的可确认模块之外 一切似乎都正常 电子邮件以及整个过程都有效 但确认页面始终是空白的 它可以工作并确认电子邮件帐户 但不会重定向用户并引发 406 错误 对于错误确认尝试 它也会执行
  • iframe 不工作

    我正在尝试让 Iframe 正常工作 我正在运行 safari 所以它是兼容的 但是当我测试它时 它显示为空白 代码 p Your browser does not support iframes p 使用 尝试一下 编辑器后 我直接从 w
  • 您如何比较 IIS 和 Cassini 作为生产服务器?

    我有一个 ASP NET 网站 当前在 IIS 上运行 现在我想将该站点移至卡西尼号上运行 Cassini 与 IIS 相比有哪些优势 它的缺点是什么 您使用 Cassini 作为生产网络服务器的体验如何 据我所知 您不能在生产中使用 Ca
  • 比较给出错误输出的日期

    我正在创建一个函数来检查充满日期的数据库表中哪个日期小于当前日期 和过去一样 我有 3 个日期来测试该函数 以及它们背后的输出 上个月的日期 2015年4月28日 16 32 00日期尚未到来 11 06 2015 13 12 00上周日期
  • java并发:多生产者一消费者

    我遇到一种情况 不同的线程填充一个队列 生产者 并且一个消费者从该队列中检索元素 我的问题是 当从队列中检索这些元素之一时 某些元素会丢失 丢失信号 生产者代码是 class Producer implements Runnable pri
  • Perl 如何在空格上分割行,除非空格用双引号引起来?

    我有以下字符串 StartProgram 1 C Program Files ABC ABC XYZ CleanProgramTimeout 1 30 我需要一个正则表达式来分割这一行 但忽略 Perl 中双引号中的空格 以下是我尝试过的但
  • Time.advance 记录在哪里?

    在网上查了一下 我发现 RubyTime班级有Time advance 这是在哪里记录的 我在 Ruby API 文档中没有看到任何提及它here http apidock com ruby Time API 文档的搜索功能表明 任何地方都
  • 将进程附加到远程 PC 上正在运行的进程

    我正在开发一个 C 应用程序 该应用程序在远程 PC 上运行 我有 VPN 连接并使用 RDP 会话 我可以登录到该计算机 在那台计算机上 在正在运行的进程旁边 还有两个 msvsmon exe 进程 在任务管理器中具有以下 命令行 条目
  • 尝试让 libmecab.dll (MeCab) 与 C# 一起使用

    我正在尝试使用日本形态分析仪MeCab http mecab sourceforge net 在 C 程序 Visual Studio 2010 Express Windows 7 中 编码出现问题 如果我的输入 粘贴到文本框中 是这样的
  • Pymongo 如何正确使用 $push 更新现有文档

    我做错了什么或者我不明白 push 可能不明白 无论如何 我有以下文件 id ObjectId 501c83051d41c8753e000000 node denver enc environment production classes
  • RSpec - 模拟(或存根)重写 mixin 方法

    我有这样的情况 module Something def my method return some symbol end end class MyClass include Something def my method if xxx o
  • 从 LAN 中的其他计算机使用 ASP.NET Web Api 服务

    我用谷歌搜索了这个问题 但找不到任何可以解决我的问题的东西 我是 ASP NET Web Api 的新手 我构建了一个 ASP NET Web Api 当我在本地计算机上从 Visual Studio 运行它时 一切都运行良好 在这两种情况
  • 从redux中的reducer获取ID

    我是个新手 正在尝试使用 React 和 Redux 构建一个简单的书签应用程序 我无法解决这个问题 用户可以创建一个书签并将其添加到多个文件夹 所以我派了一个addMark bookmark 行动 然后addMark folder or