【问题标题】:Are there any cases when React updates DOM automaticallyReact 是否有自动更新 DOM 的情况
【发布时间】:2017-09-29 13:06:47
【问题描述】:

我在 React 上阅读的所有文章都显示了我应该显式调用 this.setState() 以触发 DOM 更新时的代码。这似乎是手动触发更改检测。我打电话给this.setState,React 重新渲染虚拟 DOM,然后将其与本机 DOM 进行比较以进行更改 - 如果有任何更改,则更新 DOM。 Here is the quote 来自文档:

4) 浏览器每秒调用一次 tick() 方法。在它里面, 时钟组件通过调用 setState() 来安排 UI 更新 包含当前时间的对象。 感谢 setState() 调用, React 知道状态发生了变化,并再次调用 render() 方法 了解应该在屏幕上显示的内容。

将其与自动检查绑定更改并更新 DOM 的 Angular 摘要循环进行比较。虽然我有办法触发对组件的手动更改检测,但通常不需要。

我的问题是,是否有任何情况下 React 触发 DOM 更新而不需要我手动调用 this.setState(),即自动虚拟 DOM 更新?

【问题讨论】:

  • react 组件通过内部设置状态或外部更改其 Props 进行渲染,没有其他方法。
  • @DayanMorenoLeon,谢谢,你能提供一些例子吗?我对属性发生更改并且不需要调用 setState,但 DOM 仍会更新的情况特别感兴趣
  • 如果您正在考虑将您的角度体验与反应等同起来,我会说您错过了一些难题。您可以查看redux 进行数据流管理。没有干净的方法可以让您仅使用 react 来更改组件的 props 而无需更改某些组件的状态。为了实现这一点,你需要像 redux 这样的东西来保持你的状态在外部有点像一个数据服务,你可以从中提取数据并将其作为属性注入到组件中。您需要熟悉 Flux,如果您打算构建一个应用程序,无论如何您都必须这样做。
  • @DayanMorenoLeon,不,我不会构建 React 应用程序。我以前曾使用过 Flux 和 Redux,并且知道它们是做什么的。但他们不是我在这里要问的。我正在研究变更检测机制,即找出组件的属性发生了变化,而不是状态管理。现在,似乎我应该明确告诉 React 这发生了,它自己无法理解。它理解的唯一时间是父组件更新子组件属性时,但即使在这种情况下,似乎也只触发了一个生命周期钩子,但我仍然需要调用setState
  • 不,当父组件更新子组件并且属性更改时,子组件将被重新渲染。呈现什么数据完全取决于 render 方法的实现方式,如果您遵循生命周期方法,您会看到当属性更改时会触发 5 个方法facebook.github.io/react/docs/react-component.html#updating 每个方法都有特定的目的和参数。反应中没有自动变化检测,这需要使用观察者和双向数据流。这不是 react 的设计方式。

标签: javascript reactjs


【解决方案1】:

React 是一个状态机,它在内存中维护 DOM 的虚拟表示,当状态发生变化时,它会自动更新/呈现(在适当的情况下)。

您看到 setState 被调用以触发重新渲染的原因是因为这是最常见的(唯一的?)更新数据结构的方法,该数据结构提供了这个内部 DOM 表示(它将在通过children的属性来关闭feed down)。

setState 不是手动调用重新渲染,而是setState 导致状态改变, 这反过来又导致 React 运行差异并在适当的地方更新。这完全是关于级联数据以反映应用程序的当前状态。如果该状态没有改变,那么就没有可更新的内容,因此无需重新渲染。

这也是为什么从 React 中变异出 DOM 是一个非常糟糕的主意,因为这通常会导致 React 的 DOM 虚拟表示与 实际 之间失去对等性DOM。

尽量不要从 Angular 绑定的角度来考虑 React 数据绑定,而是从模拟 Angular 绑定在逐步状态更改的上下文中所做的事情的角度来考虑它。

【讨论】:

  • 谢谢,当状态改变时自动更新/呈现(在适当的情况下)。 - 但只有当状态通过setState改变时对吗?
  • 它触发了生命周期方法,是的。您可以使用shouldComponentUpdate 之类的方法有条件地阻止这些,但默认情况下,如果组件上的道具发生变化,那么您将获得重新渲染
  • 默认情况下如果组件上的 props 发生变化,那么您将获得重新渲染 - 仅可能如果父组件状态发生变化,对吗?当父组件状态发生变化时,它会重新渲染父组件及其所有子组件,更新这些子组件的 props 并调用 lifecycle hooks?
  • 并非所有孩子都会更新。 React 内置了一些智能(例如PureComponent),允许您将重新渲染限制为仅实际接收其道具更新值的子级。但是,是的,必须改变状态才能重新渲染任何东西,这样做的方法是从某个地方调用setState
猜你喜欢
  • 2019-11-25
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2020-09-25
  • 2023-01-05
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
相关资源
最近更新 更多