有关于什么是 useCallback 以及必要时使用它的文章。但是在一个大型项目中,很难理解何时开始使用它。因此,如果我将它用于每个用例,它会影响应用程序的性能吗?
1 回答
useCallback
并且useMemo
是辅助钩子,主要目的是添加额外的依赖检查层以确保同步性。通常你想要useCallback
确保一个稳定的签名prop
,你知道它会如何改变,而 React 不会。
function
通过props
例如传递的(引用类型)
const Component = ({ setParentState }) =>{
useEffect(() => setParentState('mounted'), [])
}
假设你有一个子组件,它在挂载时必须在父组件中设置一些状态(不常见),上面的代码会生成一个未声明依赖的警告useEffect
,所以让我们声明setParentState
一个依赖,由 React 检查
const Component = ({ setParentState }) =>{
useEffect(() => setParentState('mounted'), [setParentState])
}
现在,这种效果在每次渲染时都会运行,不仅在安装时,而且在每次更新时。发生这种情况setParentState
是因为function
每次Component
调用函数时都会重新创建它。你知道这setParentState
不会改变它的签名超时,所以告诉 React 是安全的。通过将原始助手包装在useCallback
您正在做的事情中(通过添加另一个依赖项检查层)。
const Component = ({ setParentState }) =>{
const stableSetter = useCallback(() => setParentState(), [])
useEffect(() => setParentState('mounted'), [stableSetter])
}
你去吧。现在React
知道stableSetter
在生命周期内不会改变它的签名,因此不需要运行效果。
附带说明useCallback
一下,它也用于useMemo
优化昂贵的函数调用(memoization)。
的两个主要目的useCallback
是
优化依赖引用相等的子组件以防止不必要的渲染。字体
记忆昂贵的计算计算
有什么缺点/性能吗?
useCallback
主要用于通过仅在需要时更改内容来优化性能。它通过添加一个依赖层来做到这一点,就像useEffect
(并且类似于它自己如何知道在 DOM 中必须如何改变某些东西),但是作为每一种性能优化技术,它可以向后射击,如果你用不必要的React
填充整个应用程序,,,表演会反过来。useCallback
useMemo
React.memo
所以关键是要明智地使用,仔细选择什么需要有稳定的签名,什么不需要。