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

React传递对象Prop至子组件时使用React.memo仍异常重渲染问题

问题原因

React.memo 默认会对组件接收的所有props做浅比较,只要任意一个prop的引用发生变化,就会触发子组件重渲染。
你虽然用useCallback缓存了handleClick的引用,但父组件每次渲染时,传给Button组件的deneme属性都是直接字面量生成的新对象:

<Button
  deneme={{ aaa: "aaa", bbb: "bbb" }} // 每次父组件渲染都会生成新的对象,引用发生变化
  handleClick={handleClick}
></Button>

浅比较时检测到deneme的引用变化,所以会触发子组件重渲染。

解决方案

根据你的业务场景选择任意一种即可:

  • 方案1:删除无用的deneme属性
    你当前的Button组件并没有用到deneme属性,直接移除父组件中传给Button的deneme参数即可解决问题。
    修改后父组件返回部分代码:
    return (
      <div>
        <p>{count}</p>
        <Button handleClick={handleClick}></Button>
      </div>
    );
    
  • 方案2:用useMemo缓存deneme对象
    如果业务中需要用到deneme属性,可以用useMemo缓存该对象,避免每次渲染生成新引用:
    // 父组件内新增
    const deneme = useMemo(() => ({ aaa: "aaa", bbb: "bbb" }), []);
    
    // 传参时使用缓存后的对象
    <Button
      deneme={deneme}
      handleClick={handleClick}
    ></Button>
    
  • 方案3:自定义React.memo的比较规则
    如果你确定只需要根据特定prop判断是否需要重渲染,可以给React.memo传入第二个自定义比较函数,返回true表示props无变化不需要重渲染,返回false表示需要重渲染:
    // Button.jsx 修改导出逻辑
    export default React.memo(Button, (prevProps, nextProps) => {
      // 仅比较handleClick的引用是否变化
      return prevProps.handleClick === nextProps.handleClick;
    });
    

内容的提问来源于stack exchange,提问作者Mümin ZEHİR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:03