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

我不明白你的意思

富波光
2023-03-14

我需要改变复选框检查状态,但useCallback重新呈现组件很多次。我不明白它是如何工作的。我读过很多关于它的材料。

const AppealsList = () => {
  const [isFiltered, setFiltered] = React.useState(false);
  console.log('rerender');

  const changeCheckBox = useCallback(() => {
    setFiltered(!isFiltered);
  }, [isFiltered]);

  return (
    <div className={classNames('appeals')}>
      <div className={classNames('appeals__filter')}>
        <input
          checked={isFiltered}
          className={classNames('appeals__input')}
          type="checkbox"
          readOnly={true}
        />
        <label
          onClick={changeCheckBox}
          className={classNames('appeals__filter-label')} />
      </div>
    </div>
  );
};

重新渲染的数量:

共有2个答案

倪灿
2023-03-14

setCallback用于记忆函数,因此如果您有需要大量处理的繁重函数,您不必处理两次相同的输入。例如,如果你有一个加了两个数字的函数,你给它4和3,然后它运行这个函数,并记住当你在函数中输入4和3时,结果是7。因此,下次传递4和3而不是处理结果时,它使用记忆的结果。

当useCallBack用于记忆函数时,use效应用于防止不必要的重新呈现。我认为在这种情况下,你是想使用使用效果钩子?

汪鸿波
2023-03-14

这是因为您编写的回调依赖于isFiltered,因此每次单击时它都会更改。当它不依赖于回调正在更改的状态时,它工作得最好。

要创建不经常更改的切换函数,请让它使用函数调用setState,以便它可以利用useState提供的功能状态更新,从以前的状态计算新状态:

const changeCheckbox = useCallback(() => {
    setFiltered(currentValue => !currentValue);
}, []); // look no dependencies!

您可以在此处阅读有关功能状态更新(从当前状态派生新状态)的信息:https://reactjs.org/docs/hooks-reference.html#functional-更新

如果使用以前的状态计算新状态,则可以将函数传递给setState。该函数将接收前一个值,并返回更新后的值。

 类似资料:
  • 我正在Celero git存储库中检查DoNotOptimizeAway的含义。但我还是不明白。请你用外行的话帮我理解一下好吗。尽你所能。

  • 我对遗传的理解是相当基础的。

  • 在我的Visual Studio项目中,我有以下几点,而且效果很好: 我只是想明白,编译器是否坚持我用“typename”作为d::result_of的前缀,因为它可能是模糊的,在d::result_of可以返回一个类,然后::类型可以是一个那个班的成员?这就是为什么它坚持要添加typename吗?如果是这样,那么为什么Visual Studio允许它?不合规吗? 另外,因为我已经读到了C 14或

  • 还不起作用。所以我放弃链接,我只是编码:

  • 问题内容: 我已经花了最后两天的时间来理解系统调用,但是我仍然在这里。让我直接谈谈这个问题。 在execlp的声明系统调用为与描述: 该为const char ARG和随后的椭圆在execl的(),execlp()和execle()函数可以作为为arg0,ARG1,…,ARGN被认为。 但是,我在课本中看到这样的系统调用:(“ …”是我们作为学生来识别的)。但是,此系统调用甚至与系统调用上的声明都

  • 问题内容: 为什么投给打破,当是? 问题答案: 不幸的是,没有办法对中的数组进行这样的转换。您将必须迭代数组并分别转换每个对象。 原因是安全类型,根本无法确保无需迭代遍历数组的内容就可以将其转换为Uri,这就是为什么必须对其进行迭代并分别进行转换的原因。 基本上因为可以被其他对象继承,所以不能保证数组仅包含对象。但是强制转换为超类型将是可行的,因为那样的话,类型安全就可以了。