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

如何在React函数组件props未变更时避免重复渲染?

阻止React子组件不必要重渲染的方法

当父组件state更新触发重渲染时,默认所有子组件都会跟着重渲染,哪怕子组件的props没变化。针对你这个场景,有两个关键优化点:

1. 用React.memo包裹子组件

React.memo是React提供的高阶组件,它会对组件的props做浅比较,只有当props确实变化时,才会重新渲染子组件。

另外注意:React组件的首字母必须大写,否则会被当成普通HTML标签处理,所以先把你的child1改成Child1。

修改后的子组件代码:

const Child1 = React.memo(({ val }) => {
    console.log("CHILD1 RENDERED")
    return (
        <>
            {val}
        </>
    )
})

2. 给循环渲染的子组件设置唯一key

列表渲染时必须给每个子组件设置唯一的key,这能让React准确识别每个组件的身份,避免不必要的组件销毁和重建,进一步优化渲染性能。

修改Main组件的循环部分:

loopArr.map((item) => <Child1 key={item} val={item} />)

完整优化后的代码

const Child1 = React.memo(({ val }) => {
    console.log("CHILD1 RENDERED")
    return (
        <>
            {val}
        </>
    )
})

const Main = () => {
    const [number, setNumber] = useState(0);
    const loopArr = [1, 2, 3, 4];

    return (
        <>
            {
                loopArr.map((item) => <Child1 key={item} val={item} />)
            }

            {number}

            <button onClick={() => setNumber(number + 1)}>Increment</button>
        </>
    )
}

现在点击按钮更新number时,子组件的val没有变化,就不会触发重复渲染了。

如果你的子组件props包含复杂类型(比如对象、数组),浅比较无法准确判断变化,可以给React.memo传入第二个参数,自定义props比较函数:

const Child1 = React.memo(({ val }) => {
    // 组件内容
}, (prevProps, nextProps) => {
    // 自定义比较逻辑,返回true表示不需要重渲染,false表示需要重渲染
    return prevProps.val === nextProps.val;
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:40:33