You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件声明的最优性能方式及DOM更新机制咨询

React渲染优化:实现A与实现B的核心差异

React的DOM更新逻辑基础

React通过虚拟DOM + Diff算法优化DOM更新:当组件的状态或props变化时,会生成新的虚拟DOM树,对比新旧虚拟DOM的差异后,只对实际变化的DOM节点执行更新。但组件是否会触发重渲染(甚至卸载重建),核心取决于React对组件「身份」的识别——组件的引用是否稳定。

实现A与实现B的差异分析

实现A:子组件定义在父组件内部

// ParentComponent.js
function ParentComponent(props) {
    
    const [clicks, setClicks] = useState(0);
    
    const ChildComponent = (props) => {
        return (
            <div>
                child component
            </div>
        )
    }

    return (
        <div>
            <button onClick={() => setClicks(clicks + 1)}>Click Me</button>
            <ChildComponent />
        </div>
    )
}

每次ParentComponent因clicks状态变更重渲染时,都会重新创建一个全新的ChildComponent函数引用。React会把这个新的函数识别为一个「完全不同的组件」,因此会执行以下操作:

  • 卸载之前渲染的旧ChildComponent实例
  • 重新挂载新的ChildComponent实例
  • 即便组件输出的JSX完全一致,也会完整执行组件的初始化逻辑(比如useEffect的清除函数和新的副作用回调)

这会造成完全没必要的性能开销,甚至可能导致子组件内部状态丢失。

实现B:子组件独立定义并导入

// ChildComponent.js
const ChildComponent = (props) => {
    return (
        <div>
            child component
        </div>
    )
}

// ParentComponent.js
import ChildComponent from './ChildComponent.js'

function ParentComponent(props) {

    const [clicks, setClicks] = useState(0);

    return (
        <div>
            <button onClick={() => setClicks(clicks + 1)}>Click Me</button>
            <ChildComponent />
        </div>
    )
}

ChildComponent定义在父组件外部(单独文件),其函数引用在整个应用生命周期中是固定不变的。当ParentComponent重渲染时:

  • React识别到ChildComponent是同一个组件
  • 对比其props(此处无props变化),判定无需重渲染
  • 仅更新ParentComponent自身变化的DOM节点,完全跳过子组件的渲染流程

你的猜想验证

你对实现A的判断完全正确:每次父组件重渲染都会重新声明子组件,导致React重复卸载/挂载子组件。而实现B通过稳定子组件的引用,让React能够跳过不必要的子组件更新,大幅优化渲染性能。

额外优化提示

如果因业务需求必须在父组件内部定义子组件,可以用useMemo固定子组件的引用,避免重复重建:

const ChildComponent = useMemo(() => {
    return (props) => (
        <div>child component</div>
    )
}, []) // 依赖项为空,仅初始化一次

内容的提问来源于stack exchange,提问作者scottc11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:05:26