在 Redux 中重写状态

2024-01-11

在 redux 中,我知道状态是不可变的,当你创建新状态时,你实质上是用现有的新信息更新对象,然后完全重写状态。

今天我有一个想法,我不知道它有多愚蠢。

不断重写状态的计算成本是否昂贵?我知道这是 Redux 的主要范例之一,但我想知道从内存和空间的角度来看这是否有意义。


你可以在 Redux 中改变状态,但你不应该不惜一切代价这样做,因为你会在Redux 反模式 https://github.com/coodoo/react-redux-isomorphic-example/issues/9

在普通 JavaScript 或任何框架中,改变对象可能会带来许多副作用,这可能会导致调试非常痛苦。你应该选择纯函数 https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-pure-function-d1c076bec976除非有必要变异。

现在回到 Redux,reducer 中的函数应该是纯函数。原因如下:

Redux算法 https://medium.freecodecamp.org/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468通过比较前一个和下一个状态的内存位置来检查状态是否已更新。

现在,当您在 JavaScript 中改变对象时,您只是更新现有对象,因此内存位置保持不变并且存储不会更新。改变状态也会禁用一个基本功能Redux 开发工具 https://github.com/gaearon/redux-devtools,时间旅行调试。

另一方面,如果您不改变对象,而是创建一个新对象,那么当 redux 比较 previousState(更改之前的状态)和 nextState(您发送的新状态)的内存位置时,Redux 此时会意识到发生了变化,并且它会用您的最新状态更新商店。

参考:

  • Redux 反模式:https://github.com/coodoo/react-redux-isomorphic-example/issues/9 https://github.com/coodoo/react-redux-isomorphic-example/issues/9

  • Redux devtools 的不纯功能和问题:
    https://github.com/coodoo/react-redux-isomorphic-example/commit/6998c46d3c1a102b5f1bfb4f9aa44e5e7f9f6e87#commitcomment-12457617 https://github.com/coodoo/react-redux-isomorphic-example/commit/6998c46d3c1a102b5f1bfb4f9aa44e5e7f9f6e87#commitcomment-12457617

  • 什么是纯函数?
    https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-pure-function-d1c076bec976 https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-pure-function-d1c076bec976

  • 为什么 Redux 需要减速器是“纯函数”
    https://medium.freecodecamp.org/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468 https://medium.freecodecamp.org/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468

  • Redux 开发工具:https://github.com/gaearon/redux-devtools https://github.com/gaearon/redux-devtools

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

在 Redux 中重写状态 的相关文章

随机推荐

  • jQuery fadeIn fadeOut 点击

    我试图在单击另一个 div 时使 div 淡入 并在单击另一个 div 时再次淡出 这将是关闭按钮 但我的代码不起作用 我是否忘记了什么 这是 CSS body margin 0 padding 0 text align center ba
  • 编写 Django 脚本

    使用 Django 设置 模型 实用程序等编写 python 脚本 不在 Django 服务器应用程序中运行 的最佳方法是什么 从而能够通过批处理过程对应用程序数据库进行操作 EDIT 我需要在另一台服务器中使用它来对数据库进行相当复杂的操
  • 不希望 mysql 自动将 String 转换为 Integer

    我发现 MYSQL 从 String 到 Integer 的自动类型转换在我看来很奇怪 mysql gt select from isps where id 3ca6fb49 9749 3099 b30d 19ce56349ad6 OR u
  • 为单例类制作装饰器——typescript

    我正在使用 VueJS 和 Typescript 构建一个项目 我觉得使用服务而不是像 Vuex 这样的任何状态管理库很舒服 但是在编写服务时 我必须始终在每个服务类中复制粘贴一些代码 以使其成为单一的 class MyService pr
  • 如何在 Android 中获取 Facebook 上的所有照片

    我正在开发一个应用程序 其中我将 Facebook SDK 用于不同的目的 目前我已经实现了通过Facebook登录 现在我的下一个任务是获取登录用户的所有照片并将其显示在网格中 我正在关注 Facebook 官方开发者网站作为此任务的参考
  • 使用 img srcset 处理响应式图像

    我将 Angular 与材质一起使用 并使用 img srcset 来处理标题的响应图像 这就是我到目前为止正在做的事情 img src assets mtn bg 1600 jpg alt Header image 我对如何使用 srcs
  • TASM:乘法后如何在屏幕上打印寄存器对 dx:ax?

    include io h cr equ 0dh lf equ 0ah stacksg segment stack dw 100 dup stacksg ends datasg segment prp1 db 1st Number cr lf
  • 浏览器后退按钮

    我使用以下代码行来禁用注销后浏览器后退按钮问题 function LogoutOnClick window history go 1 但是 这段代码有一个问题 假设我有三页 第一页是登录页面 login cshtml 和第二个成功登录页面
  • 使用 C# 远程更改 Windows Server 2008 计算机的计算机名称?

    也许有人能够向我指出一个决定性的资源 以了解如何使用 C 在 Windows Server 2008 计算机上远程更改计算机名称 我已经查看了很多网站寻求帮助 现在在我的任务的第二天 并没有真正接近 除了决定 WMI 几乎是我唯一的选择 完
  • 模板化转换构造函数无法访问受保护的数据成员

    我有一个带有转换构造函数的模板类 矩形 它允许在 矩形 到 矩形 之间进行转换 反之亦然 但是在编译代码时 编译器会给出错误 指出构造函数无法访问类的受保护成员 这是代码 include
  • Internet Explorer Web 开发人员工具栏是否可以使用弹出窗口?

    我无法让 Internet Explorer Web 开发人员工具栏与弹出窗口一起使用 它不会在弹出窗口的底部呈现 有什么建议么 有一个very具体方法是 open the developer tools via F12 or whatev
  • 忽略标点符号并突出显示给定字符串中的模式

    我有一个模型字符串和匹配模式列表 我想突出显示给定模型字符串中的所有匹配模式 即使模式 模型中的任何单词包含标点符号 示例字符串 Lorem Ipsum is simply dummy text of the printing and ty
  • 为什么 Perl 有一个单独的“perl”编译器和“perlcc”前端?

    我试图用我的 Perl 代码制作一个可执行文件 然后我意识到没有这样的选项可用perl编译器 经过一番搜索 我发现perlcc http search cpan org dist B C script perlcc PL 它是 Perl 编
  • 在 Meteor.js 中,为什么 this.userId == 未定义?

    我正在通过阅读一本书来学习 Meteor 现在我们想要insert the userId当前登录的用户的 Template categories events keyup add category function e t if e whi
  • 为基于 Web 的应用程序实现自动提醒电子邮件功能

    我想为我的 Web 应用程序创建一个功能 一旦用户输入我的数据库 每 4 周就会向他们发送一封电子邮件 提醒他们提供一些反馈等 我听说 cron 工作就是我正在寻找的 但我很好奇还有什么 是否有一个 php 脚本存在或者有一个简单的方法来做
  • 在 AWS Step Functions Parallel 状态下,如果一个分支失败,是否有办法确保其他分支继续运行直至完成?

    我有一个具有并行状态的步进函数 该函数有四个分支 A B C D 每个分支都有 3 个 Glue StartJobRun 任务状态 如果分支 A 在第一个任务期间失败 我如何确保其他分支在成功后继续执行其任务 正如您在 AWS Step F
  • 将 TAG 格式转换为语料库的正则表达式

    我正在使用一个名为 AntConc 的语料库语言学工具 其中有一个文档 其中每个单词都被标记为词性 名词 形容词等 并且您可以使用特定的命令来提取匹配项 例如 如果我正在寻找一个名词 标记为 NN 我会使用 NN它会找到文档中的每个名词 我
  • jQuery 日期选择器宽度

    我不明白为什么这这么难做到 关于 jQuery 的一切都如此简单 如何设置 jQuery display inline 的宽度日期选择器 我已经编辑了 jquery ui css 但是一旦我更改月份 它就会重置宽度 我希望这只是我错过的一些
  • 16字节三重DES解密无效密钥

    我有一个 Android 项目 其中从我的 Web 服务获取 Triple DES 加密的文本片段 我需要 Triple DES 解密 但是 我收到无效的关键异常 我的密钥已转换为十六进制格式 但出现错误 W System err java
  • 在 Redux 中重写状态

    在 redux 中 我知道状态是不可变的 当你创建新状态时 你实质上是用现有的新信息更新对象 然后完全重写状态 今天我有一个想法 我不知道它有多愚蠢 不断重写状态的计算成本是否昂贵 我知道这是 Redux 的主要范例之一 但我想知道从内存和