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

用循环内的参数反应钩子useCallback

苏凯
2023-03-14

我试图了解钩子的功能,但是我似乎不太明白应该如何正确地使用函数usecallback。根据我对钩子规则的理解,我应该称它们为顶级的,而不是逻辑内的(比如循环)。这让我很困惑,我应该如何在从循环呈现的组件上实现UseCallback

请看下面的示例片段,其中我使用onclick处理程序创建了5个按钮,该处理程序将按钮的编号打印到控制台。

const Example = (props) => {
  const onClick = (key) => {
    console.log("You clicked: ", key);
  };
  
  return(
    <div>
      {
        _.times(5, (key) => {
          return (
            <button onClick={() => onClick(key)}>
              {key}
            </button>
          );
        })
      }
    </div>
  );
};
console.log("hello there");

ReactDOM.render(<Example/>, document.getElementById('root'));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id='root'>
</div>

现在,由于我在

共有1个答案

蓝恩
2023-03-14

这里的简单答案是,您可能不应该在这里使用usecallbackUseCallback的要点是将相同的函数实例传递给优化的组件(例如purecomponentreact.memoized组件),以避免不必要的重新发送器。

在这种情况下(或者我怀疑大多数情况下),您没有处理优化的组件,所以没有理由像使用usecallback那样记录回调。

但是,假设记忆很重要,这里最好的解决方案可能是使用一个函数而不是五个函数:不是每个按钮通过闭包携带的唯一函数,而是将附加到元素:

<button data-key={key}>{key}</button>

然后从单击处理程序中的event.target.dataset[“key”]中读取密钥:

const Example = (props) => {
  // Single callback, shared by all buttons
  const onClick = React.useCallback((e) => {
    // Check which button was clicked
    const key = e.target.dataset["key"]
    console.log("You clicked: ", key);
  }, [/* dependencies */]);
  
  return(
    <div>
      {
        _.times(5, (key) => {
          return (
            <button data-key={key} onClick={onClick}>
              {key}
            </button>
          );
        })
      }
    </div>
  );
};
console.log("hello there");

ReactDOM.render(<Example/>, document.getElementById('root'));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>

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

  • 我目前正在构建一个动态表单引擎,希望在呈现应答摘要组件时显示redux存储区的结果。我认为最好的方法是在加载answerSummary组件后设置“complete”状态并将其设置为true,但在map函数中这样做不起作用,并抛出无限循环react错误。 代码如下: 编辑:我知道你不能在渲染中设置状态-我这样写是为了尝试和传达我想要做的事情

  • 我正在学习JavaScript/React。我试图在react网站上为tic-tac-toe示例创建一个简单的for循环,但到目前为止,它一直存在问题。奇怪的是,有几个映射示例,但没有for循环示例。 无论如何,对于以下各项: 当我替换"测试代码"时,这个工作 但这次失败了 第二个选项失败,因为它没有创建“单独的”onClick元素。我怎样才能使失败的例子起作用? 更新#1 更新#2我按照@Mat

  • 我正在尝试使用react钩子创建一个悬停以显示div,我遇到了以下问题: 第69:31行:在函数“renderHideOptionalClauseTrigger”中调用React钩子“useState”,该函数既不是React函数组件,也不是自定义React钩子函数React钩子/钩子规则 搜索关键字以了解有关每个错误的更多信息。 以下是我的代码库:

  • 我通常使用getBoundingClientRect()。宽度当开发一个Swiper组件使用反应挂钩,但在一些例子getBoundingClientRect()。宽度返回0。 我在useEffect函数中使用了setTimeout,效果很好; 下面是简单的swiper代码演示: 简单swiper演示代码

  • 我得到以下错误,不确定我在箭头函数内实例化 react 钩子时做错了什么: 错误:挂接调用无效。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM)。 您可能违反了钩子的规则。 同一应用程序中可能有多个React副本。请参阅https://reactjs.org/link/invalid-hook-call有关如何调试和修复此