当前位置: 首页 > 知识库问答 >
问题:

为什么要避免this.set(this.state)?

邵耀
2023-03-14

在React中,我尝试了两种方法:

  • 然后更改状态this.setState(this.state)
  • 克隆状态,更改状态克隆,然后更改此.setState(stateClone)

它们都起作用,产生相同的结果。为什么建议(在文档中)设置为状态克隆(使用Object.assign),而不是设置为状态本身?状态的对象标识在React中重要吗(没有Redux)?似乎只要调用setState,不管状态对象标识如何,render()都会被触发。

共有2个答案

穆高澹
2023-03-14

setState不关心您设置的对象是否具有与当前状态相同的引用。render()将以任何方式调用。

不变性仅在使用shouldComponentUpdate生命周期方法进行优化的上下文中用于浅层检查(使用===比较前后),默认情况下,该方法返回true。

翟渝
2023-03-14

Javascript对象和数组通过引用传递,而不是值,当我们说

stateClone=this.state

我们没有复制状态对象,我们只是创建对同一对象(this.state)的新引用。现在,如果我们对State Clone做任何改变,比如

stateClone.someProp=someValue

实际上,我们直接对原始状态进行变异,这是禁止的,因为以这种方式进行的变异可能会在下一次setState调用中被覆盖。

这就是为什么,Object.assign扩展运算符(...)用于创建状态对象的副本,并对该副本进行更改。

更多信息:https://medium.com/pro-react/a-brief-talk-about-immutability-and-react-s-helpers-70919ab8ae7c

 类似资料:
  • 问题内容: 通常我会尽可能避免转换类型,因为我认为这是不良的编码实践,并且可能会导致性能下降。 但是,如果有人要我解释为什么会这样,我可能会像前灯中的鹿一样看它们。 那么,为什么/何时铸造不好? 它对于Java,C#,C ++是通用的,还是每个不同的运行时环境都按照自己的方式处理? 欢迎使用任何语言的细节,例如为什么在c ++中不好? 问题答案: 您已经用三种语言标记了这三种语言,答案在三种语言之

  • 问题内容: 我已经在多个地方多次看到过这种情况,但是从未找到令人满意的解释来说明为什么会这样。 因此,希望这里会介绍一个。为什么我们(至少通常)不使用和? 编辑:我看到人们以为这个问题与Web服务器有关,但事实并非如此。我可以理解为什么传递给未经处理的字符串可能很糟糕。在非Web应用程序中不好吗? 问题答案: 通常有更清晰,更直接的方法来获得相同的效果。如果构建复杂的字符串并将其传递给,则代码将难

  • 问题内容: Process p = Runtime.getRuntime().exec(command); is = p.getInputStream(); byte[] userbytes = new byte[1024]; is.read(userbytes); 我想从java在linux os中执行shell命令。但是Pmd报告说不要使用Java Runtime.exec()。为什么?是什么

  • 问题内容: 假设我们在页面上有一个DIV ,并且想要将该DIV的内容复制(“复制粘贴”)到另一个DIV中。我们可以这样做: 或使用jQuery: 但是,看来此方法不是一个好主意,应避免使用。 (1)为什么要避免这种方法? (2)应该怎么做呢? 更新: 为了解决这个问题,我们假设DIV中没有ID为ID的元素。 (对不起,我忘了在原始问题中介绍此案。) 结论: 我已经在下面发布了我对这个问题的答案(如

  • 我的公司不允许使用Mockito。在单元测试中验证。甚至有一个定制的声纳规则 规则如下 应该通过断言来验证结果,而不是使用“验证到执行”过程验证。因为如果我们验证流程,在流程更改后需要更多的努力来维护测试,但输入和输出保持不变。确保每一行代码都对结果有影响,并断言结果以证明逻辑正确 不合规代码示例 合规解决方案 对于数据库或中间件操作,断言使用嵌入式数据库或中间件成功写入数据。 对于restful

  • 为什么可能是这种测试要避免的事情。 我在对这个答案的评论中读到了这一点:https://stackoverflow.com/a/21172873/516167 标记应在其上进行注射的字段。 允许速记模拟和间谍注入 最小化重复模拟和间谍注入 参考:@InjectMocks JavaDoc。