Reactjs 在React中,setState和forceUpdate之间有什么区别

Reactjs 在React中,setState和forceUpdate之间有什么区别,reactjs,Reactjs,在不覆盖shouldComponentUpdate的组件中,forceUpdate和setState之间有什么区别吗 更新:我已经知道文档中说了什么,forceUpdate不是推荐的方法。我只是想对正在发生的事情有更深入的了解。我想知道为什么?我已经知道setState将传递的对象(状态“delta”-有点像sql更新)与当前状态对象合并 假设一个简单的用例:不需要撤销或时间旅行功能。不需要在shouldComponentUpdate中进行指针比较。事实上,根本不需要使用shouldCompon

在不覆盖shouldComponentUpdate的组件中,forceUpdate和setState之间有什么区别吗

更新:我已经知道文档中说了什么,forceUpdate不是推荐的方法。我只是想对正在发生的事情有更深入的了解。我想知道为什么?我已经知道setState将传递的对象(状态“delta”-有点像sql更新)与当前状态对象合并

假设一个简单的用例:不需要撤销或时间旅行功能。不需要在shouldComponentUpdate中进行指针比较。事实上,根本不需要使用shouldComponentUpdate

在这种情况下,在我看来,改变状态并调用forceUpdate()是使用React的一种非常有效的方法。从黑盒的角度来看,这两种技术似乎具有完全相同的效果:

技巧#1: 这个.state.x=10; 这个.forceUpdate()

技术#2: this.state.setState({x:10})

再说一次,我已经知道有些人更喜欢从不改变状态。并使用函数式编程风格。我只是想知道是否有任何技术原因可以避免使用技术1。还是我遗漏了什么?

关于
setState()的概述
setState()
函数通常用于使用一个或多个新状态属性更新组件状态。这是改变状态和管理视图更新的典型方式

从官方文件:

setState()
将更改排入组件状态队列并告知React 此组件及其子组件需要使用 更新状态。这是用于更新用户的主要方法 接口以响应事件处理程序和服务器响应


关于
forceUpdate()的概述
forceUpdate()
函数只是强制重新呈现组件及其相关子组件的一种方法。它根本不会改变状态

在可能的情况下,您应该避免使用此功能,因为它偏离了React思维模式,即您的状态和道具只负责保持应用程序逻辑与视图的最新状态

从官方文件:

默认情况下,当组件的状态或道具发生更改时 组件将重新渲染。如果您的
render()
方法依赖于某些 对于其他数据,您可以告诉React组件需要重新渲染 通过调用
forceUpdate()

通常,您应该尽量避免使用
forceUpdate()
,只从
render()
中的
this.props
this.state
读取


区别 需要注意的是,
forceUpdate()
将跳过
shouldComponentUpdate()
(如果有)中的逻辑检查,其中as
setState()
不会跳过它

这里一个有趣的注意事项是,以下两行将始终产生相同的结果:

this.setState(this.state);
this.forceUpdate();
…除非
shouldComponentUpdate()
可以返回
false
,如上所述


除上述内容外,两者之间没有功能上的区别。

在《FullStack React》一书中,有一章介绍了基本计时器应用程序。在本章中,他们使用forceUpdate()重新呈现UI,并给出以下解释:

“你可能会问:如果我们不不断地打电话,不是会更有效率吗?” 未运行的计时器上的forceUpdate()? 事实上,我们可以节省一些周期,但不值得添加代码 React将调用render(),该函数执行一些简单的操作 然后将此结果与上一个结果进行比较 调用render()并查看是否没有任何更改。它会在那里停止-不会 尝试任何DOM操作。“ 摘自:安东尼·阿科马佐、阿里·勒纳、大卫·古特曼、内特·默里、克莱 奥尔索普和泰勒·麦金尼斯。“满栈反应”我的书


我认为这意味着,如果使用setState是可行的,那么您应该获得绝对的最大性能,但是如果所讨论的操作并不昂贵,并且可以避免大量代码复杂性,那么使用forceUpdate()重新呈现UI就可以了。这当然是我的解释,你可能应该通读这本书,从中获得更多的上下文,也许它会帮助你自己下定决心。

颤振是一个基于React架构的框架

我认为这篇博客文章实际上给出了这个问题的最佳答案:


注意:Flatter的“空setState调用”大致类似于React的forceUpdate。

这两者之间没有相似之处,它们完全不同,setState用于更新状态变量,然后React触发重新渲染,通过forceUpdate()我们可以告诉React组件需要重新渲染。检查这个:使用技巧有一定的缺点1:你可以检查一下性能如何?基本上,如果子组件具有新状态,它将再次重新启动?@TomSawyer,严格来说,性能,
forceUpdate()
可能会更快,因为它跳过运行
shouldComponentUpdate()
。正如我上面解释的。它将触发所有子组件的渲染,是的。也就是说,请务必使用
setState()
。引用源代码时,请使用引号而不是代码块。