Redux:为什么避免突变是使用它的基本部分?

2024-06-26

我是 Redux 的新手 - 我真的很想了解使用函数式编程使单向数据更加优雅的全局。

在我看来,每个减速器都采用旧状态,创建一个新状态而不改变旧状态,然后将新状态传递给下一个减速器以执行相同的操作。

我知道不造成副作用可以帮助我们获得单向数据流的好处。

我真的不明白不改变旧状态有什么重要的。

我唯一能想到的可能是我读过的“时间旅行”,因为如果你坚持每一种状态,你就可以执行和“撤消”。

问题:

还有其他原因导致我们不想在每一步都改变旧状态吗?


如果处理得当,使用不可变数据结构可以对性能产生积极影响。就 React 而言,性能通常是指在数据未更改的情况下避免应用程序不必要的重新渲染。

为此,您需要将应用程序的下一个状态与当前状态进行比较。如果状态不同:重新渲染。否则不要。

要比较状态,您需要比较状态中的对象是否相等。在普通的旧 JavaScript 对象中,您需要进行深度比较才能查看对象内的任何属性是否发生了变化。

对于不可变的对象,你不需要它。

immutableObject1 === immutableObject2

基本上就可以了。或者如果您使用像 Immutable.js 这样的库Immutable.is(obj1, obj2).

就反应而言,您可以将其用于shouldComponentUpdate方法,就像流行的PureRenderMixin does.

shouldComponentUpdate(nextProps, nextState) {
    return nextState !== this.state;
}

当状态没有改变时,此函数可以防止重新渲染。

我希望这有助于不可变对象背后的推理。

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

Redux:为什么避免突变是使用它的基本部分? 的相关文章

随机推荐

  • realloc:下一个大小无效和 malloc:内存损坏(快速)

    我正在做 K 和 R C 编程书中的一个练习 该程序用于从用户输入的一组行中找到最长的行 然后打印它 Inputs This is a test This is another long test this is another long
  • Spring boot 2.0.0.M4 需要一个名为“entityManagerFactory”的 bean,但无法找到

    使用 spring boot 2 0 0 M4 的版本我遇到了这个问题 Description Field userRepository in webroot websrv auth service JwtUserDetailsServic
  • Struts2 属性标签 escapeHtml 不起作用,我遗漏了什么吗?

    以下代码无法正常工作 我想从 bean 中获取以下 Java 字符串 String statusMsg Hello World br br h3 Test h3 并使用未转义的 HTML 标签输出它
  • 音隙 + Ubuntu 12.04

    我正在尝试让 Phonegap 在 Ubuntu 12 04 上工作 到目前为止 我已经使用本指南成功 很好 安装了它 http perrymitchell net article install phonegap ubuntu 12 04
  • 未找到带标签的句柄可放入图例中

    我正在尝试在 PyPlot 中创建一个平行四边形 我不准备绘制平行四边形 首先我使用以下代码放入矢量箭头 fig plt figure ax fig add subplot 111 ax spines left set position z
  • 编辑 XDocument 中的特定元素

    我最近开始学习C 使用时遇到了问题XML Linq存储数据 我希望这个问题是可以理解的 因为我还不熟悉所有正确的术语 而且英语不是我的母语 我读了很多问题 谷歌搜索 但我自己无法弄清楚 我想更新现有的 XDocument 文件 如下所示
  • 我应该使用 CSS3 媒体查询为视网膜显示设备提供不同的图像尺寸吗?

    之前已经在这里问过许多类似的问题 我相信我的有点独特 我用 JQM Cordova PhoneGap 开发了一个移动应用程序 最初我使用大图像 针对视网膜显示设备 并使用响应式 CSS 根据需要缩小图像 这种方法的问题在于 较旧的设备最终必
  • C 中的联合与结构

    这个问题背后的想法是理解使用 union 的更深层次概念并以不同的方式使用它以节省内存 我对所有人的问题是 假设有一个结构 struct strt float f char c int a 和联合中表示的相同结构 union unin fl
  • NSAttributedString '\n' 被忽略

    我有一个视图 其唯一的 UI 元素是UITextView In viewDidLoad 我使用 Text n 创建一个属性字符串 并将文本视图的属性文本设置为 NSAttributedString string NSAttributedSt
  • Python 3.2 中的十六进制解码

    在 Python 2 x 中我可以这样做 gt gt gt 4f6c6567 decode hex codec Oleg 但在Python 3 2中我遇到了这个错误 gt gt gt b 4f6c6567 decode hex codec
  • 获取每件商品的最新价格

    我有一张桌子 ItemID PurchaseDate Price 001 03 17 2013 19 00 002 03 17 2013 14 00 001 03 18 2013 13 00 002 03 18 2013 15 00 001
  • MVC WebGrid 设置渲染的ID

    使用 MVC 3 中的 WebGrid 如何在呈现时指定控件的名称 即呈现时表的 id var someGrid new WebGrid source Model Users defaultSort Name rowsPerPage 50
  • android - 将水平viewpager与垂直viewpager结合起来

    我想将默认的水平 ViewPager 与某种垂直ViewPager https stackoverflow com questions 13477820 android vertical viewpager 我的方法是水平 ViewPage
  • 测试 Spyne 应用程序

    测试 Spyne 应用程序的最佳实践是什么 有没有类似的测试客户端Django https docs djangoproject com en 1 5 topics testing overview module django test c
  • 根据不规则数据绘制曲面

    我正在从分散的数据集中绘制填充轮廓图或曲面图 与其他 Q 的主要区别在于数据不是凸的 r th meshgrid 10 15 0 180 x y deal r sind th r cosd th z x 2 y 2 scatter x y
  • 从 Etsy 商店获取所有列表图像

    情况 我一直在使用 Etsy 沙箱 API 来尝试为想要向所有 Etsy 列表显示默认图像和标题的客户找出解决方案 点击后 他们希望它引导他们离开网站并进入 Esty 列表页面 现在 弄清楚如何获取所有列表的名称和 url 很容易 并且可以
  • PHP 简化三元运算

    在 PHP 中 有没有一种方法可以进一步简化 而不使用if foo bar 0 foo 我想知道是否有办法不重新分配 foo如果条件满足 则返回到自身 我知道有一种方法可以在 Javascript 中做到这一点 使用 对吧 但我想知道是否有
  • 尝试在 Anaconda 中更新和使用 scipy 模块时出错

    我对 Python 比较陌生 一直在尝试将 Anaconda 更新到最新版本 很遗憾 scipy根本不会进口 今天我已经安装和卸载了 Anaconda 7 次 但没有成功 Here s sys version 3 6 6 Anaconda
  • 如何在 Keras Lambda Layer 中使用 OpenCV 函数?

    我正在尝试使用一个在图像上使用某些 OpenCV 函数的函数 但我得到的数据是张量 我无法将其转换为图像 def image func img img cv2 cvtColor img cv2 COLOR BGR2YUV img cv2 r
  • Redux:为什么避免突变是使用它的基本部分?

    我是 Redux 的新手 我真的很想了解使用函数式编程使单向数据更加优雅的全局 在我看来 每个减速器都采用旧状态 创建一个新状态而不改变旧状态 然后将新状态传递给下一个减速器以执行相同的操作 我知道不造成副作用可以帮助我们获得单向数据流的好