【发布时间】: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