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

IT技术 reactjs
2021-05-09 06:07:01

没有覆盖shouldComponentUpdate的组件中,forceUpdate和setState有什么区别吗?

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

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

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

技术#1: this.state.x = 10;this.forceUpdate();

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

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

3个回答

一般关于 setState()

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

来自官方文档:

setState()将组件状态的更改加入队列,并告诉 React 该组件及其子组件需要使用更新后的状态重新渲染。这是您用来更新用户界面以响应事件处理程序和服务器响应的主要方法。


一般关于 forceUpdate()

forceUpdate()函数只是一种强制重新渲染组件及其子组件的方法。它根本不会改变状态。

如果可能,您应该避免使用此函数,因为它偏离了 React 的思维方式,在这种思维方式中,您的 state 和 props全权负责使您的应用程序逻辑与您的视图保持同步。

来自官方文档:

默认情况下,当您的组件的 state 或 props 发生变化时,您的组件将重新渲染。如果你的render()方法依赖于其他一些数据,你可以通过调用forceUpdate().

通常,您应该尽量避免使用forceUpdate()并且只从this.propsthis.statein 中读取render()


差异

重要的是要注意,forceUpdate()跳过检查逻辑shouldComponentUpdate()(如果有的话),而 assetState() 不会跳过它。

这里有趣的一点是,以下两行将始终产生相同的结果:

this.setState(this.state);
this.forceUpdate();

...除非shouldComponentUpdate()可以返回false如上所述。

除上述以外,两者在功能上没有区别。

在 FullStack React 一书中,有一章制作了一个基本的 Timer 应用程序。在本章中,他们使用 forceUpdate() 重新渲染 UI,解释如下:

“你可能会问:如果我们不对没有运行的定时器持续调用 forceUpdate() 会不会更有效率?事实上,我们会节省几个周期。但是增加代码复杂性是不值得的。React 将调用 render(),它在 JavaScript 中执行一些廉价的操作。然后它会将这个结果与之前对 render() 的调用进行比较,并看到没有任何变化。它就停在那里——它不会尝试任何 DOM 操作。” 摘自:安东尼·阿科马佐、阿里·勒纳、大卫·古特曼、内特·默里、克莱·奥尔索普和泰勒·麦金尼斯。“全栈react。” 电子书。

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

Flutter 是一个基于 React 架构的框架。

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

避免空状态回调

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