当前位置: 首页 > 知识库问答 >
问题:

我应该用useCallback或useMemo包装每个道具,何时使用这个挂钩?

张银龙
2023-03-14

现在react钩子可用了,如果是函数组件,我应该用useCallback包装通过props传递的每个函数,用useMemo包装其他props值吗?

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

什么是好的做法来决定哪些道具或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。

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

共有2个答案

沈琛
2023-03-14

我同意@jalooc提出的原则

为了进一步了解OP中展示的用例,以下是我的建议:

function Component() {
  const callback = useCallback(() => { dostuff }, [deps])

  return <Child prop={callback} />
}

如果要渲染的Child是一个非常昂贵的组件,那么上面的说明是有意义的。因此,它可能是这样导出的:

function Child() { 
   ...this takes significant CPU... 
}

// Export as a pure component
export default React.memo(Child)
function Component({ foo }) {
  // This very expensive computation will only run when it's input (foo)
  // changes, allowing Component to re-render without performance issues
  const bar = useMemo(() => {
     ... something very complicated with `foo` ...
  }, [foo])

  return <div>{bar}</div>
}
  1. 做有意义的事情,或者做那些衡量糟糕表现的事情
池麒
2023-03-14

不值得,原因有多种:

  1. 甚至官方文件也说,你应该只在必要的时候做

把所有的钩子放在一起——如果你想把钩子放在任何地方,那么键入所有钩子的时间要比用户在应用程序中使用钩子所获得的时间还要多。好的老规则适用于:测量,然后优化。

 类似资料:
  • 问题内容: 随着反应钩现已我应该在功能部件的情况下,包裹用的道具通过各项功能useCallback并与其他所有的道具价值useMemo? 我的组件中还具有依赖于任何props值的自定义函数,我应该使用useCallback包装它吗? 有什么好的做法来决定使用此钩子从组件中包装哪些prop或const值? 如果这样可以提高性能,为什么不一直这样做呢? 让我们考虑在包装点击处理程序并添加自定义逻辑的自

  • 在了解其他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)!如果您不调用而是返回一个值,那么您将需要进行一些操作。该方法应该用于链接:

  • 问题内容: 的(Java持久性API)规范有2名不同的方式来指定实体组合键:和。 我在映射的实体上同时使用了这两个注释,但是对于不太熟悉的人来说,这真是一个大麻烦。 我只想采用一种指定复合键的方法。哪个真的是最好的?为什么? 问题答案: 我认为这可能更冗长,因为无法使用任何字段访问运算符来访问整个主键对象。使用,您可以这样做: 这给构成组合键的字段提供了清晰的概念,因为它们都聚集在通过字段访问运算

  • 问题内容: 我收到以下错误: 这是我的组件: 我在这里做错了什么? 问题答案: 由于您已经使用过,因此该组件将无法作为道具使用。由于您已经使用过,作业操作将作为道具提供,您可以像这样使用它们 但是您可以进一步简化它,例如

  • 问题内容: React16.3.0已发布,并且ContextAPI不再是实验功能。DanAbramov(Redux的创建者)对此发表了很好的评论,但是Context仍然是实验性功能已经有两年了。 我的问题是,根据您的看法/经验,何时应该在 React Redux上* 使用 React Context ,反之亦然? * 问题答案: 由于 Context 不再是实验性功能,您可以直接在应用程序中使用C

  • 我正在为一个看起来像这样的纸牌游戏制作一个反应大厅:大厅图像 每个名称和“kick”按钮都是一个react组件,我根据名称列表(该列表中的所有名称都是唯一的)呈现该组件。我认为,由于名称是唯一的,我可以使用名称作为键,但由于某些原因,我得到以下错误:错误消息 我做错了什么? 注意:我还尝试了为KickButton键做key={Player"1"},以使其与相应的PlayerIcon唯一,但错误仍然

  • 给定一个呈现其子级的简单组件: 问题:儿童道具的道具类型应该是什么? 当我将其设置为对象时,当我使用具有多个子级的组件时,它会失败: 警告:失败的道具类型:提供给