useCallback:什么时候使用?是否存在任何退税/性能问题



有一些文章与什么是useCallback以及在必要时使用它有关。但在一个大项目中,很难理解何时开始使用它。所以,如果我在每个用例中都使用它,它会影响应用程序的性能吗。

useCallbackuseMemo是辅助挂钩,主要目的是添加一层额外的依赖性检查以确保同步性。通常,您希望使用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中的某些东西必须如何改变(,但作为每一种性能优化技术,它都可以向后射击,如果你用不必要的useCallbackuseMemoReact.memo填充整个应用程序,那么性能就会反过来。

因此,关键是要明智地使用,仔细选择哪些需要稳定的签名,哪些没有。

相关内容