当前位置: 首页 > 面试题库 >

用React的useCallback钩子代替useEffect的意图是什么?

东郭存
2023-03-14
问题内容

我试图了解用React的useCallback钩子代替钩子的用例是什么useEffect

它们似乎都充当其输入的状态更改的侦听器(示例取自React Docs):

useEffect(
  () => {
    const subscription = props.source.subscribe();
    return () => {
      subscription.unsubscribe();
    };
  },
  [props.source],
);

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

但是,该useEffect钩子还具有清理资源的额外好处,而您以前可能会使用componentWillUnmount

那么,有什么好的用例useCallback呢?而且,我在这里想念什么?


问题答案:

useEffect与之相关的时序非常具体,您可以在此处阅读。指定的功能将在渲染完成且DOM已更新后执行。这将在每次渲染后发生,其中第二参数数组中指定的任何值都会更改。

useCallback不会自动执行任何操作。它返回一个可以由任何需要触发它的代码执行的函数。没有监听导致回调执行的更改。数组值仅控制返回该函数的哪个实例。数组值不控制函数执行的时间。

一个关键的用例是将此功能作为道具传递给子组件以用作事件处理程序。useCallback允许您定义一个内联函数以用作事件处理程序(因此它可以访问定义该函数的上下文中的任何其他变量),而无需在每次渲染时都将唯一的prop传递给子级。只要第二个参数数组中的值未更改,就将返回与先前渲染相同的函数。因此,如果子组件是纯组件,则不会因为总是接收到唯一的事件处理函数而强制其重新呈现。

没有 useCallback

const Parent = ()=> {
   const [a, setA] = useState(null);
   const eventHandler = ()=> {
      // every render creates a unique instance of eventHandler
      // even though it always does the same thing so long as 'a' hasn't changed
      doSomethingWithA(a);
   }
   return <Child onClick={eventHandler}/>
}

useCallback

const Parent = ()=> {
   const [a, setA] = useState(null);
   const eventHandler = useCallback(()=> {
      // A unique function instance is passed in to useCallback on every render, but
      // eventHandler will be set to the first instance of this function
      // (i.e. potentially an instance of the function that was passed to useCallback
      // on a previous rendering) that was passed to useCallback
      // for the current value of 'a'.
      doSomethingWithA(a);
   }, [a]);
   return <Child onClick={eventHandler}/>
}

与React文档相比,本文提供了有关用例useCallback和其他挂钩的详细信息。



 类似资料:
  • 我在useeffect钩子上得到以下错误。 React Hook use效应有一个缺失的依赖项:当前页面。要么包含它,要么删除依赖array.eslintreact-钩子/穷举-deps 你知道我为什么会得到这个吗? }

  • 我想使用React钩子的来设置视频流的src对象,但视频引用为null,我得到的错误是:TypeError:无法在GetMedia处设置null的属性“src对象”。我正在使用来调用记录引用的函数。 奇怪的是,我看到了和一个current值。参见控制台日志截图: 我读过useRef的文档,也看过关于Stack Overflow和Github的所有其他文章,但无法弄清楚这一点。最近的一个帖子是这一个

  • 我试图了解钩子的功能,但是我似乎不太明白应该如何正确地使用函数。根据我对钩子规则的理解,我应该称它们为顶级的,而不是逻辑内的(比如循环)。这让我很困惑,我应该如何在从循环呈现的组件上实现。 请看下面的示例片段,其中我使用处理程序创建了5个按钮,该处理程序将按钮的编号打印到控制台。 现在,由于我在中使用了箭头函数,每次呈现示例时都会创建一个新的函数实例,我这样做是因为我希望函数知道是哪个按钮调用了它

  • 如何使用钩子(或任何其他钩子)来复制? 在传统的类组件中,我将执行以下操作: 使用hook: (完整示例:https://codesandbox.io/s/2oo7zqzx1n) 这不起作用,因为在中返回的“cleanup”函数捕获装载期间的道具,而不是卸载期间的道具状态。 如何在不运行函数体(或清除)的情况下对每个道具更改进行清理? 一个类似的问题并没有涉及获得最新道具的部分。 文件状态为: 如

  • 我正在尝试新的React Hooks的API,它似乎一直在无限循环中运行!我只希望中的回调运行一次。下面是我的代码供参考:

  • 我是一个很新的反应,并得到以下错误: 我想在提交表单时使用另一个组件。因此,在文件A中,当表单提交时,is使用一个函数,在调用其他组件之前首先检查某些内容,如: 在组件上,我有一些usstate钩子: 当页面正在加载的时候,我得到了这个错误,有没有人知道什么是错误的?