有一些文章与什么是useCallback以及在必要时使用它有关。但在一个大项目中,很难理解何时开始使用它。所以,如果我在每个用例中都使用它,它会影响应用程序的性能吗。
useCallback
和useMemo
是辅助挂钩,主要目的是添加一层额外的依赖性检查以确保同步性。通常,您希望使用useCallback
来确保prop
的稳定签名,您知道该签名将如何更改,而React不会。
通过props
传递的function
(参考类型(,例如
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
一样用于优化昂贵的函数调用(内存化(。
useCallback
的两个主要用途是
优化依赖引用相等的子组件,以防止不必要的渲染。字体
记忆昂贵的计算
是否存在任何缺点/性能?
useCallback
主要用于通过仅在需要时更改内容来优化性能。它通过添加一层依赖关系来做到这一点,就像useEffect
一样(类似于React
本身知道DOM中的某些东西必须如何改变(,但作为每一种性能优化技术,它都可以向后射击,如果你用不必要的useCallback
、useMemo
、React.memo
填充整个应用程序,那么性能就会反过来。
因此,关键是要明智地使用,仔细选择哪些需要稳定的签名,哪些没有。