当前位置: 首页 > 面试题库 >

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

徐杰
2023-03-14
问题内容

我不明白为什么当我使用setTimeout函数时,我的react组件开始进入无限console.log。一切正常,但PC开始陷入困境。有人说超时中的功能会更改我的状态,并会重新渲染组件,设置新的计时器等。现在,我需要了解如何清除它是正确的。

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]
  )

问题答案:

__useEffect 每次运行时useEffect都会在运行中 返回
函数(首次运行在组件安装上除外)。考虑一下它,因为每次useEffect执行新的执行时,旧的执行都会被删除。

这是使用和清除超时或间隔的一种有效方法:

export default function Loading() {   
     const [showLoading, setShowLoading] = useState(false)

     useEffect(
        () => {
          let timer1 = setTimeout(() => setShowLoading(true), 1000)

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

 return showLoading && <div>I will be visible after ~1000ms</div>
}

如果您需要清除超时或间隔时间不在某个地方:

export default function Loading() {   
     const [showLoading, setShowLoading] = useState(false)

     const timerToClearSomewhere = useRef(false) //now you can pass timer to another component

     useEffect(
        () => {
          timerToClearSomewhere.current = setInterval(() => setShowLoading(true), 50000)

          return () => {
            clearInterval(timerToClearSomewhere.current)
          }
        },
        []
      )

  //here we can imitate clear from somewhere else place
  useEffect(() => {
    setTimeout(() => clearInterval(timerToClearSomewhere.current), 1000)
  }, [])

 return showLoading ? <div>I will never be visible because interval was cleared</div> : <div>showLoading is false</div>
}


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

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

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

  • 我只想在进行ajax调用时清除上一个间隔并设置一个新的间隔。 当前代码为: 我尝试了许多推荐的变化,以便能够从函数外部清除间隔。如; 将"间隔"变量设置为null或false, 窗设定间隔, 在setInterval中写入计数函数, 将count函数作为ajax函数之外的单独函数编写, 但这两种变化都没有消除间隔。 稍后,我还需要清除键入的间隔。

  • 我有一个名为Interval的setInterval,它运行一个倒计时计时器。我有一个开始按钮,第一次点击时播放,第二次暂停就好了。当我双击时,它会将计时器显示回零,但似乎并没有清除实际的计时器。将只播放在显示被0替换之前停止的地方。

  • get_user_record()此函数调用在数据库中提取数据的方法。我使用超时是因为我不想从这个方法得到响应,showUpdatedProgressBar()方法不断地检查数据库计数,并相应地给进度条赋值。为此,我使用了setInterval()函数,该函数正在工作,但无法清除间隔。请告诉我哪里出错了。