我应该将组件中定义的所有函数都包装在 useCallback 中吗?

IT技术 reactjs react-hooks usecallback
2021-05-08 22:09:03

据我所知,在 React 的功能组件中定义的函数会在组件重新渲染时重新生成。由于 useCallback 可以由特定的依赖项触发,因此可以防止这些函数不必要的重新生成。我应该将它们中的每一个都包装在 useCallback 中,并传递相关的依赖项吗?

import React from 'react'

const Comp = () => {
   const fn1 = useCallback(
     ()=>{
      // do something
   }, [dependency1])

   const fn2 = useCallback(
     ()=>{
      // do something
   }, [dependency2])

   return (
      //something
   )
}
2个回答

useCallback将有助于避免在功能组件重新呈现时重新生成功能。然而,功能的重新创建并没有造成太大的性能差异。

在以下情况下应首选使用 useCallback

  1. 如果您将函数作为 props 传递给子组件,并且子组件通常不需要重新渲染,除非某个 prop 更改,那么 useCallback 可能会阻止某些重新渲染。但是,如果您的状态很复杂并且您需要将多个这样的函数作为props传递给子组件,那么最好将方法转移到useReducer而不是useStatedispatch方法传递给子组件

  2. 您正在指定一个函数作为对 的依赖useEffect在这种情况下,您必须确保不会在每次渲染时重新创建该函数,否则useEffect将在每次渲染时触发。

总的来说,useCallback必须明智地而不是盲目地做出使用决定,因为您可能会过度使用所提供的优势useCallback并最终降低性能,因为useCallback还会记住函数,并且频繁变化的依赖关系可能无论如何都需要重新创建函数。

只是在上面的答案中添加另一个案例。有时你可能有一个计算量很大的函数,你可能不希望它在每次渲染时计算结果,所以在这种情况下你也可以使用useCallback