javascript - 我应该用 useCallback 或 useMemo 包装每个 prop,什么时候使用这个钩子(Hook)?

标签 javascript reactjs react-hooks

现在有了 react 钩子(Hook),我应该在功能组件的情况下用 useCallback 包装通过 props 传递的每个函数吗?以及所有其他 Prop 值 useMemo

我的组件内还具有依赖于任何 props 值的自定义函数,我应该用 useCallback 将其包装起来?

有哪些好的做法可以决定使用此钩子(Hook)包装组件中的哪些 props 或 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)一样)确实需要一些微小的处理,没有什么是免费的。尽管它很小,但它仍然比什么都没有(与仅仅传递一个基元相比)要重要,所以你用这种方法会搬起石头砸自己的脚。

将所有内容放在一起 - 如果您想将它们放在任何地方,您会浪费更多的时间来键入所有钩子(Hook),而不是用户将它们放在应用程序中。古老的好规则仍然适用:衡量,然后优化

关于javascript - 我应该用 useCallback 或 useMemo 包装每个 prop,什么时候使用这个钩子(Hook)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55310682/

相关文章:

javascript - 使用表单运行 javascript 方法

javascript - 字符串转换和函数调用的区别 - JavaScript

javascript - 在 Draft JS 中实现自动完成但没有像 "trigger"这样的 "@"

javascript - 我的输入 : onChange handler is not working on mobile

javascript - 从下拉列表中选择选项时响应警告

javascript - 是否有从对象渲染组件的方法? - react

javascript - 选项选择的文字颜色

javascript - 从动态创建的 ObjectArray 中删除一个对象

reactjs - 卸载 react 组件时是否可以调度函数? ( react 功能组件)

compiler-errors - Gulp + CJSX : Unexpected indentation while parsing