调用render 时,DOM一定会更新吗,为什么?

不一定。调用 render() 并不意味着 DOM 一定会更新。

React 的渲染流程:

在 React 中,“渲染(render)”分为两步:

Render Phase(渲染阶段)
  • 调用组件的 render()(类组件)或函数组件本体

  • 得到新的虚拟 DOM(Virtual DOM)

Commit Phase(提交阶段)
  • React 比较新旧虚拟 DOM(Diff)

  • 只有发生变化的部分才会真正更新到真实 DOM

所以:

render() 调用 ≠ DOM 更新

当 render 被调用时,只是产生新的虚拟 DOM。
React 会通过 Diff 判断是否需要实际的 DOM 操作。

DOM 什么时候不会更新?

1. PureComponent / React.memo 阻止 rerender

如果 props 和 state 没变化,根本不会进入 render。

2. render 生成的虚拟 DOM 与上一次一致

即使调用 render,虚拟 DOM 没变,React 也不会更新真实 DOM

3. 父组件重新渲染但子组件使用 memo 或 shouldComponentUpdate

子组件不会 DOM 更新。

4. setState 更新相同值
this.setState({ count: 1 });
this.setState({ count: 1 });

React 会跳过 DOM 更新。

结论

render 调用只代表“虚拟 DOM 重新生成”,不保证真实 DOM 会更新。
React 必须在 diff 后判定有变化,才会执行真实 DOM 更新。

posted @ 2025-11-20 09:04  煜火  阅读(5)  评论(0)    收藏  举报