跳转到主要内容

渲染和提交

当你的应用发生变化时,React 会做两件事:先计算应该显示什么(渲染 Render),再把变化应用到页面(提交 Commit)。 了解这两个阶段,能帮助你写出稳定、性能更好的组件。

什么会触发渲染?

  • State 更新(例如 setState
  • 父组件重新渲染导致子组件也渲染
  • Context 值变化(见 Context

渲染阶段:只负责“算 UI”

一个“纯粹”的渲染函数像数学函数:相同输入得到相同输出。

TypeScript
function Greeting({ name }: { name: string }) {
  return <h1>你好,{name}</h1>;
}

为什么渲染必须纯粹?

React 可能会在提交前重复渲染(例如开发环境的严格模式、并发渲染策略)。 如果你在渲染时做了副作用,就可能出现“渲染一次却执行多次”的奇怪 bug。

TypeScript
let called = 0;

function Bad() {
  called = called + 1;
  return <p>我被渲染了 {called} 次</p>;
}
常见误区
  • 在渲染中修改外部变量、写入 localStorage、发请求、订阅事件等,都属于副作用。
  • 这些操作应该放到 Effect(或事件处理函数)中。

提交阶段:把变化真正更新到页面

当 React 决定“这一帧可以提交了”,才会把渲染结果应用到 DOM,并触发生命周期/Effect。 这也是为什么你能在 Effect 里安全地与外部系统同步。

TypeScript
import { useEffect, useState } from 'react';

function Good() {
  const [called, setCalled] = useState(0);

  useEffect(() => {
    setCalled((c) => c + 1);
  }, []);

  return <p>组件挂载次数:{called}</p>;
}

下一步

动手练习

运行并修改下面的组件,熟悉交互式示例的编辑与预览。

🌐浏览器运行
渲染和提交 - React 文档 - React 文档