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

父组件更新时子组件因点击处理器props重复渲染,如何阻止?

解决React子组件因传递点击函数props导致重复渲染的问题

问题核心在于:父组件每次重新渲染时,都会重新创建onHandleClick这个函数,导致传递给MemoizedSubComponent的handleClick props引用发生变化。memo做的是浅比较,它会认为props变了,所以触发子组件重新渲染。

解决方案:用useCallback缓存点击函数

useCallback可以帮你缓存函数的引用,只要依赖项数组里的内容不变,每次父组件渲染时都会返回同一个函数引用,这样memo就能正确识别props没有变化,避免子组件不必要的渲染。

修改后的代码如下:

import { useState, memo, useCallback } from 'react';

function SubComponent({ handleClick }) {
  console.log("component render");
  return <div onClick={handleClick}>SubComponent</div>;
}

const MemoizedSubComponent = memo(SubComponent);

export default function App() {
  console.log('app render')
  const [test, setTest] = useState(1);
  
  // 用useCallback包裹函数,空依赖数组表示这个函数永远不会重新创建
  const onHandleClick = useCallback(() => {
    console.log(1)
  }, []);
  
  const increment = ()=>{
    setTest(test+1)
  };
  
  return (
    <> 
      <button onClick={increment}>Increment {test}</button>
      <MemoizedSubComponent
          handleClick={onHandleClick}
      /> 
    </>
  );
}

验证效果

修改后点击Increment按钮,控制台只会输出app render,子组件的component render不会再重复出现,说明子组件没有触发不必要的渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:38:19