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

我应该在何时使用此钩子时将每个道具用useCallback或useMemo包装起来?

秦钟展
2023-03-14
问题内容

随着反应钩现已我应该在功能部件的情况下,包裹用的道具通过各项功能useCallback并与其他所有的道具价值useMemo?

我的组件中还具有依赖于任何props值的自定义函数,我应该使用useCallback包装它吗?

有什么好的做法来决定使用此钩子从组件中包装哪些prop或const值?

如果这样可以提高性能,为什么不一直这样做呢?

让我们考虑在包装点击处理程序并添加自定义逻辑的自定义按钮

function ExampleCustomButton({ onClick }) {
  const handleClick = useCallback(
    (event) => {
      if (typeof onClick === 'function') {
        onClick(event);
      }

      // do custom stuff

    },
    [onClick]
  );

  return <Button onClick={handleClick} />;
}

让我们考虑在包装单击处理程序并根据条件添加自定义逻辑的自定义按钮

function ExampleCustomButton({ someBool }) {
  const handleClick = useCallback(
    (event) => {
      if (someBool) {
        // do custom stuff
      }
    },
    [someBool]
  );

  return <Button onClick={handleClick} />;
}

在这两种情况下,我应该用useCallback包装我的处理程序吗?

与使用备忘录类似的情况。

function ExampleCustomButton({ someBool }) {
  const memoizedSomeBool = useMemo(() => someBool, [someBool])
  const handleClick = useCallback(
    (event) => {
      if (memoizedSomeBool) {
        // do custom stuff
      }
    },
    [memoizedSomeBool]
  );

  return <Button onClick={handleClick} />;
}

在此示例中,我甚至将备注值传递给useCallback。

另一种情况是,如果在组件树中许多组件记忆相同的值?这对性能有何影响?


问题答案:

不值得,有多种原因:

  1. 即使是官方文档,您也应该只在必要时这样做。
  2. 请记住, 过早的优化是万恶之源 :)
  3. 这使DX(开发人员经验)更加糟糕:它很难阅读;更难写 难以重构。
  4. 当处理原语时(例如您的示例),记记要比不记账花费更多的CPU能力。原始值没有 引用 的概念,因此在它们中没有要记住的内容。另一方面,备忘录本身(和其他任何钩子一样) 确实 需要一些微小的处理,没有什么是免费的。即使它很小,也比没有传递任何东西(与仅传递原始图元相比),因此您将用这种方法射击自己的脚。

放在一起-键入所有的钩子比将它们放置在应用程序中的用户花费更多的时间。遵循良好的旧规则:先 测量,然后进行优化



 类似资料:
  • 在了解其他hook的实现后,理解useMemo与useCallback的实现非常容易。 本节我们以mount与update两种情况分别讨论这两个hook。 mount function mountMemo<T>( nextCreate: () => T, deps: Array<mixed> | void | null, ): T { // 创建并返回当前hook const ho

  • 问题内容: 从请求返回之前,我有一些异步方法需要等待完成。我正在使用Promises,但我不断收到错误消息: 为什么这令人高兴?这是我的代码: 问题答案: 只要避免构造函数反模式-promise-construction-antipattern-and-how-to-avoid- it)!如果您不调用而是返回一个值,那么您将需要进行一些操作。该方法应该用于链接:

  • 问题内容: 我正在尝试了解钩子功能,但是我似乎还不太清楚如何正确使用该函数。据我从有关钩子的规则中了解到的,我应该将它们称为顶级,而不是在逻辑(如循环)之内。这让我很困惑,应该如何在从循环渲染的组件上实现。 看一下下面的示例代码片段,在该代码片段中,我创建了5个带有处理程序的按钮,该处理程序将按钮的编号输出到控制台。 现在,由于我在中使用arrow函数,因此每次在Example呈现时都会创建一个新

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

  • 问题内容: 我注意到,如果我对打开的文件进行迭代,则无需“读取”该文件即可更快地对其进行迭代。 即 比 第二个循环将花费大约1.5倍的时间(我在完全相同的文件上使用了timeit,结果是0.442对0.660),并且会得到相同的结果。 所以-我什么时候应该使用.read()或.readlines()? 由于我一直需要遍历正在读取的文件,并且在学习了艰难的方式之后,.read()在大数据上的运行速度

  • 我是通过阅读Spring Boot in Action这本书开始学习Spring Boot的,我正在学习这本书中的示例,试图自己运行它们,但我在使用时遇到了问题。 我已经翻遍了这一章,寻找我可能的不匹配。然而,它就是不起作用。 这个项目应该是一个简单的阅读清单。 代码如下: 读者@实体: Jpa接口: