反应挂钩useCallback没有依赖

时间:2019-07-31 15:44:01

标签: javascript reactjs react-hooks

使用useCallback而不使用dep作为简单事件处理程序有意义吗?

例如:

const MyComponent = React.memo(() => {
  const handleClick = useCallback(() => {
    console.log('clicked');
  }, []);

  const handleOtherClick = () => {
    console.log('clicked');
  };

  return (
    <div>
      <button onClick={handleClick}>Click me</button>
      <button onClick={handleOtherClick}>Click me too</button>
    </div>
  );
});

在这种情况下使用useCallback有什么优缺点?

1 个答案:

答案 0 :(得分:5)

import pandas as pd, numpy as np # works pd.DataFrame(index=list(range(2)), data={'x':np.uint8(1)}) # TypeError: data type not understood # TypeError: values must be a 1D list-like pd.DataFrame(index=list(range(2)), data={'x':np.uint8(1)}, dtype='UInt8') 的用途不依赖于您是否具有依赖关系。这是为了确保参照完整性。为了获得更好的性能。如果需要的话。

因为仅具有函数或函数表达式的流程本身会使代码运行良好(我的意思是它不需要我们做任何额外的动作来引用实际的道具等)。因此useCallback仅与性能有关。

假设我们渲染纯组件(useCallback的实例或包装在React.PureComponent中的功能组件)

React.memo

在这里,如果function MyComponent() { const onChangeCallback = ... return <SomePureComponent onChange={onChangeCallback} />; } 仅声明为函数或箭头表达式,它将在每个渲染器上重新创建。因此,它在参考上会有所不同。嵌套的子项每次都会重新渲染,而不必这样做。

另一种情况是将此回调作为其他onChangeCallbackuseCallbackuseMemo中的依赖项列出。

useEffect

在这里,我们将在function MyComponent() { const onChangeCallback = ...; return <Child onChange={onChangeCallback} /> } ... function Child({onChange}) { useEffect(() => { document.body.addEventListener('scroll', onChange); return () => document.body.removeEventListener('scroll', onChange); }, [onChange]); } 中具有引用不同的onChange,而无需使用Child。因此,useCallback将在每次调用父useEffect时运行。虽然我们不需要这样做。

所以,是的,当您实际上没有任何依赖项时,将依赖项列表为空比将声明内联函数根本不使用MyComponent更好。

如果您的子组件不是真的正确并且有内存泄漏(例如useCallback不返回清除功能),则{p> 1}实际上可能会部分减轻后果。当然,这不是目标(编写有内存泄漏的组件),但对我来说,即使在简单的处理程序下使用useEffect也要0.5分