微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 useRef 可用于在 react 中存储 setInterval 引用而不是普通变量?

如何解决为什么 useRef 可用于在 react 中存储 setInterval 引用而不是普通变量?

我正在尝试理解 React 中的 useRef 钩子。

我在 react 中创建了一个简单的时间。其代码如下。

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

function Parent() {
  const [count,setCount]=useState(5);
  const ref=useRef(0);
//let hold=0;
  const countdown=()=>{
      ref.current=setInterval(()=>{
        // console.log('ref.current-->',ref.current);
        setCount((c)=>c-1)
       
      },1000)
  }
  useEffect(()=>{
    if(count<1)
        clearInterval(ref.current)
  },[count])
  
  return(
      <>
      <h3>Timer : {count}</h3>
      <br/>
      <button onClick={countdown}>countdown</button>
    </>
  )
}

export default Parent;

这里我使用钩子创建了一个 ref 并且我正在监视计数状态。当它达到 0 时,我正在调用 'clearInteval' 函数来清除计时器。

代码运行良好。

但是当我尝试使用普通变量而不是钩子创建的变量来做同样的事情时,间隔没有被清除。

请在下面找到相同的代码

import { useRef,setCount]=useState(5);
  const ref=useRef(0);
let hold=0;
  const countdown=()=>{
    hold=setInterval(()=>{
        // console.log('ref.current-->',1000)
  }
  useEffect(()=>{
    if(count<1)
        clearInterval(hold)
  },[count])
  
  return(
      <>
      <h3>Timer : {count}</h3>
      <br/>
      <button onClick={countdown}>countdown</button>
    </>
  )
}

export default Parent;

在这里不明白什么?

这段代码应该可以在普通的 javaScript 中工作。

解决方法

const myRef = useRef() 将提供一个 ref 对象,这样 myRef.current 的值将在渲染中保持不变。当您使用 let myVar = something 时,myVar 将在每次渲染时重新创建,因此您每次都会丢失并替换其值。

每次状态更改时,您的 Parent 组件都会重新渲染,因此您可以将间隔引用保留为 useRef 的引用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。