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

使用挂钩对功能组件计数器进行反应

夏骞尧
2023-03-14

我试图理解新的React钩子及其用例。

我的目标是一个单一的组成部分,计算起来,也每x滴答计数另一个计数器。

我使用useEffect和useState实现了它,主要有两个问题:
1。组件在调用超时之前卸载时发生内存泄漏(使用react router导航时)
2。该组件在每个刻度上渲染两次,因为useEffect和useState都会触发渲染。

我认为解决方案是使用useRef或usemo,但我还没有弄明白。

我的当前组件(带有typescript):

import React from "react";

const Component: React.FC = () => {
  const [trigger, setTrigger] = React.useState(0);
  const [timer, setTimer] = React.useState({ cycle: 0, count: 0 });

  let refTimer = React.useRef({ cycle: 0, count: 0 });

  // useRef
  // React.useEffect(() => {
  //   setInterval(() => {
  //     console.log("tick");
  //     if (refTimer.current.count % 2 === 0) {
  //       refTimer.current.cycle++;
  //       setTimer(refTimer.current);
  //     }
  //     refTimer.current.count++;
  //     setTimer(refTimer.current);
  //     // console.log(timer);
  //   }, 1000);
  // }, []);

  // useState
  React.useEffect(() => {
    console.log("effect tick");
    setTimeout(() => {
      console.log("tick");
      const count = timer.count + 1;
      if (count % 2 === 0) {
        const cycle = timer.cycle + 1;
        setTimer({ ...timer, count, cycle });
        return;
      }
      setTimer({ ...timer, count });
    }, 1000);
  }, [timer]);
  return (
    <div>
      <br />
      <br />
      <br />
      <br /> Playground:
      <div>Count: {timer.count}</div>
      <div>Cycle: {timer.cycle}</div>
      <button type="button" onClick={(): void => setTrigger(trigger + 1)}>
        Trigger Count: {trigger}
      </button>
    </div>
  );
};

export default Component;

正如我所说,像这样,我有提到的两个问题。我可以完全删除使用效果来修复双重渲染,但是当我点击触发按钮时,刻度会堆积起来,这比双重渲染更糟糕。

注释的useRef部分是我尝试过的,但不知何故它不起作用。

我感谢所有的帮助!

编辑:第三个小问题是,像这样,计数器只在setTimeout下运行,这将触发另一个setTimeout,因此如果该过程需要一些时间,它实际上不会是一个精确的间隔。

因此,我的目标是在一个单独的进程中运行一个时间间隔(我会说在useEffect中),它会在每个滴答声中导致重新渲染,而不会在每次调用或其他事件触发重新渲染时叠加。

暂时还没有答案

 类似资料:
  • 问题内容: 随着React 中钩子的引入,现在的主要困惑是何时将函数组件与钩子和类组件一起使用,因为在钩子的帮助下,甚至可以在函数组件中获得和部分使用。所以,我有以下问题 钩子的真正优点是什么? 何时使用带有钩子的函数组件和类组件? 例如,带有钩子的功能组件不能像类组件那样帮助性能。他们没有执行就不能跳过重新渲染。还有其他原因吗? 提前致谢。 问题答案: 引入和其他特性(例如和)的思想是帮助减少必

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 问题内容: 当我用酶测试类组件时,我可以设置状态。当我用钩子测试功能组件时,现在该怎么做? 例如,在我的组件中,我有: 我想在测试中进行更改 问题答案: 使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。您仍然可以确保组件将正确的状态传递到其子级。 您可以在Kent C. Dodds撰写的这篇博客文章中找到一个很好的例子。 这是摘录的代码示例。 依赖状态执行细节的测试-

  • 我有一个类扩展了React。组件类,我将为我希望接收的道具传递我自己的接口。问题是当我使用webstorm linter说有问题,指出类型“typeof SomeComponent”上不存在属性“propTypes”。 我不知道为什么会这样...... 的代码为 当我编写以下代码创建函数组件时,会引发类似的异常: 在本例中,使用

  • 我正在构建一个应用程序(使用TypeScript),我面临一个问题,该解决方案需要识别不同的子组件的可能性。基本上是这样的: 我已经搜索了一段时间,许多,如果不是所有接受的答案(像这里:只允许反应组件中特定类型的子级),都是使用()。不幸的是,也有人说在生产中可能会缩小,所以我不能依赖它。 我发现的唯一方法是“强制”一个自己的显示名称。基本上,我创建了一个接口,然后为每个应该可以识别的组件扩展它。

  • 问题内容: 在带有钩子的React中,更新状态的正确方法是嵌套对象是什么? 一个人怎么会使用到的更新来(附加一个字段)? (改变价值)? 问题答案: 您可以像这样传递新值