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

反应挂钩-清除超时和间隔的正确方法

姜嘉荣
2023-03-14

我不明白为什么当我使用setTimeout函数时,我的react组件会启动到infinite console.log。一切正常,但个人电脑开始像地狱一样落后。有人说函数在超时改变我的状态,还有重新启动组件,设置新的计时器等等。现在我需要知道如何证明它是正确的。

export default function Loading() {
  // if data fetching is slow, after 1 sec i will show some loading animation
  const [showLoading, setShowLoading] = useState(true)
  let timer1 = setTimeout(() => setShowLoading(true), 1000)

  console.log('this message will render  every second')
  return 1
}

在不同版本的代码中清除不利于:

const [showLoading, setShowLoading] = useState(true)
  let timer1 = setTimeout(() => setShowLoading(true), 1000)
  useEffect(
    () => {
      return () => {
        clearTimeout(timer1)
      }
    },
    [showLoading]
  )

共有1个答案

景俊良
2023-03-14

已定义返回()=

沙盒示例

import { useState, useEffect } from "react";

const delay = 5;

export default function App() {
  const [show, setShow] = useState(false);

  useEffect(
    () => {
      let timer1 = setTimeout(() => setShow(true), delay * 1000);

      // this will clear Timeout
      // when component unmount like in willComponentUnmount
      // and show will not change to true
      return () => {
        clearTimeout(timer1);
      };
    },
    // useEffect will run only one time with empty []
    // if you pass a value to array,
    // like this - [data]
    // than clearTimeout will run every time
    // this value changes (useEffect re-run)
    []
  );

  return show ? (
    <div>show is true, {delay}seconds passed</div>
  ) : (
    <div>show is false, wait {delay}seconds</div>
  );
}

沙盒示例。

import { useState, useEffect, useRef } from "react";

const delay = 1;

export default function App() {
  const [counter, setCounter] = useState(0);
  const timer = useRef(null); // we can save timer in useRef and pass it to child

  useEffect(() => {
    // useRef value stored in .current property
    timer.current = setInterval(() => setCounter((v) => v + 1), delay * 1000);

    // clear on component unmount
    return () => {
      clearInterval(timer.current);
    };
  }, []);

  return (
    <div>
      <div>Interval is working, counter is: {counter}</div>
      <Child counter={counter} currentTimer={timer.current} />
    </div>
  );
}

function Child({ counter, currentTimer }) {
  // this will clearInterval in parent component after counter gets to 5
  useEffect(() => {
    if (counter < 5) return;

    clearInterval(currentTimer);
  }, [counter, currentTimer]);

  return null;
}

丹·阿布拉莫夫的文章。

 类似资料:
  • 问题内容: 我不明白为什么当我使用函数时,我的react组件开始进入无限console.log。一切正常,但PC开始陷入困境。有人说超时中的功能会更改我的状态,并会重新渲染组件,设置新的计时器等。现在,我需要了解如何清除它是正确的。 清除不同版本的代码无法帮助: 问题答案: __ 每次运行时都会在运行中 返回 函数(首次运行在组件安装上除外)。考虑一下它,因为每次执行新的执行时,旧的执行都会被删除

  • 我正在尝试开发一个滑块,如果用户没有点击后退或前进按钮,它每5秒就会改变一次。 但是如果他(用户)这样做了,间隔会触发多次。。。为什么? 我将间隔保存在一个变量中,并清除该变量,因此我不知道为什么这不起作用。。。但是看看你自己: }); 感谢阅读;-)

  • 在这个项目中,我使用了反应钩,这个片段用来改变项目的颜色主题,但有一个问题,我无法解决。常量lightTheme={...} Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 我的减速器:

  • 我在for循环中有一个set interval函数,当它在set interval函数中时,如果它满足条件,就会发出警报并清除间隔。下面是我的代码,但它不工作。谁能告诉我这里的错误是什么。 谢谢 我试图解决的是:当本地时间与定时器数组中的时间匹配时,我需要每次获得警报(第0列;定时器[计数][0])。数组已经排序

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