【问题标题】:Why is child component re-rendering if only prop has useCallback?如果只有 prop 有 useCallback,为什么子组件会重新渲染?
【发布时间】:2021-05-25 03:28:01
【问题描述】:

子组件只有在其 prop (numberModifier) 被修改时才应该重新渲染。 numberModifier 使用没有依赖关系的 useCallback。因此,它永远不会改变。

为了测试这一点,我修改了“online”(在 Application 内部)的值,它恰好是 Parent 的属性,因此当“online”被修改时,Application 和 Parent 都会重新渲染。

这是有道理的。

但是,Child 也会重新渲染。我不明白为什么会这样。只是prop(numberModifier)没有被修改。

为什么修改 online (Application) 的值时 Child 重新渲染?

如果这是正确的行为,那么使用 useCallback 的意义何在?

function Application() {
 const [online, setOnline] = useState(true);

  return (
    <div>
    <button onClick={()=>setOnline(!online)}>Change Flag</button>
    <Parent online={online}/>
    </div>
  );
}
function Parent({online}) {
  const [number, setNumber] = useState(1);
  const numberModifier = useCallback(()=> {
    setNumber(69)
  },[])

  return (
    <>
    <p>Online is {online.toString()}</p>
    <p>Number is {number}</p>
    <Child numberModifier={numberModifier} />
    </>
  );
}
function Child({ numberModifier }) {
    return (
        <button onClick={numberModifier}>modify</button>
    );
}

这是从分析器截取的屏幕截图。这表明 Child 被重新渲染,因为它的父级被重新渲染。 注意:Child 是绿色条。

【问题讨论】:

    标签: javascript reactjs react-hooks usecallback


    【解决方案1】:

    好的,所以当父组件的状态发生一些变化时,所有子组件都会重新渲染,除非您使用 React.memo(Child) 包装您的子组件。

    const [online, setOnline] = useState(true);
    
      return (
        <div>
        <button onClick={()=>setOnline(!online)}>Change Flag</button>
        <Parent online={online}/>
        </div>
      );
    

    当online 状态已更改时, 所有子组件都重新渲染,在这种情况下你的&lt;Parent online={online}/&gt;

    因为您的 Parent 获得了道具 online,所以无论您将 numberModifier 与 useCallback 包装在一起,您的 Parent 中的整个嵌套组件都将被重新渲染。

    如果您想防止 Child 组件重新渲染,请使用 React.memo() 包装您的 Child 组件

    【讨论】:

    • 如果是这样,使用 useCallback 有什么好处?
    • 如果函数 props 没有被 useCallback 包裹,无论你是否使用 React.memo,你的子组件都会被重新渲染。因为在父组件中每次重新渲染都会创建 numberModifier
    猜你喜欢
    • 2019-12-27
    • 2021-12-15
    • 2020-02-13
    • 2021-11-24
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多