哪些方法会触发 React 重新渲染?重新渲染 render 会做些什么 ?
在 React 中,以下几种情况会触发组件的重新渲染:
- 状态更新:当组件的状态(state)被更新时(通常是通过
setState
或useState
的更新函数),React 会调度重新渲染该组件。 -
Props 变化:当父组件传递给子组件的 props 发生变化时,子组件会被重新渲染。
-
父组件重新渲染:如果一个组件的父组件被重新渲染,那么这个组件也会被重新渲染,除非这个组件实现了
shouldComponentUpdate
方法或使用React.memo
来阻止不必要的渲染。 -
Context 变化:如果组件订阅了某个 context,当这个 context 的值发生变化时,组件会被重新渲染。
-
强制更新:通过调用组件实例的
forceUpdate
方法,我们可以强制重新渲染组件,即使状态和 props 都没有变化。
当一个组件被重新渲染时,React 会执行以下步骤:
- 调用 render 方法:React 会调用组件的
render
方法(或函数组件的主体),得到描述组件 UI 的 React 元素。 -
比较新旧元素:React 会将新的 React 元素与上一次渲染的元素进行比较。如果元素类型和 key 相同,React 会认为这是同一个元素,只需要更新元素的 props;如果元素类型或 key 不同,React 会销毁旧元素,创建并挂载新元素。
-
更新 DOM:根据新旧元素的比较结果,React 会生成一份 “变更” 列表,然后应用这些变更到真实的 DOM 上,以使得 DOM 的状态与新的 React 元素相匹配。
请注意,React 使用了一种称为 “调和”(Reconciliation)的算法来决定哪些部分需要更新,这使得 React 可以高效地更新和渲染组件,而不需要重新渲染整个应用。