Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的";useInterval“;can';不要让计时器正确计数_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 我的";useInterval“;can';不要让计时器正确计数

Javascript 我的";useInterval“;can';不要让计时器正确计数,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我想做一个计时器。 我的代码是 导出默认功能测试(){ const[count,setCount]=useState(0) 函数倒计时(){ 设置计数(计数+1); } useInterval(()=>{ 倒计时(); },1000,计数) 返回( {count} ) } 这里是useInterval function useInterval(callback, delay) { const ref = useRef() useEffect(() => {

我想做一个计时器。 我的代码是

导出默认功能测试(){
const[count,setCount]=useState(0)
函数倒计时(){
设置计数(计数+1);
}
useInterval(()=>{
倒计时();
},1000,计数)
返回(
{count}
)
}
这里是
useInterval

function useInterval(callback, delay) {
     const ref = useRef()
     useEffect(() => {
         ref.current = callback;
     })
     useEffect(() => {
         const timerId = setInterval(ref.current, delay); 
         return () => {
             clearInterval(timerId);
         }
     }, [delay])
 }


const timerId = setInterval(()=>{ ref.current() }, delay);
这些代码不起作用。
计数只增加一次

但是如果我更改代码
const timerId=setInterval(参考电流,延迟)
to
const timerId=setInterval(()=>{ref.current()},延迟)

它起作用了! 我不明白为什么我写的代码是错误的。
你能告诉我为什么吗?

你想给一个空数组作为useffect的第二个参数,这样函数在初始渲染后只运行一次

由于闭包的工作方式,这将使计数器变量始终引用初始值。您可以使用setCounter的函数版本来始终获得正确的值

范例

const { useState, useEffect } = React;

function App() {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setCounter(counter => counter + 1);
    }, 1000);

    return () => {
      clearInterval(interval);
    };
  }, []);

  return <h1>{counter}</h1>;
};

ReactDOM.render(
  <App />,
  document.getElementById('root')
);

<script src="https://unpkg.com/react@16.7.0-alpha.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.7.0-alpha.0/umd/react-dom.development.js"></script>

<div id="root"></div>
const{useState,useffect}=React;
函数App(){
const[counter,setCounter]=useState(0);
useffect(()=>{
常量间隔=设置间隔(()=>{
设置计数器(计数器=>计数器+1);
}, 1000);
return()=>{
间隔时间;
};
}, []);
返回{counter};
};
ReactDOM.render(
,
document.getElementById('root'))
);

晚上好,我想它可能与javascript参考系统有关

会更好;)

简言之,当你像

const timerId = setInterval(ref.current, delay)

将对属性的引用传递给ref.current,执行成功后,ref.current将删除对属性的引用。我可以建议你使用闭包。()=>ref.current(),它可以保证引用始终存在。

为什么你认为它是错误的?调试时,它是如何失败的?它与您的“正确代码”有何不同?请提供有关问题的详细信息。
const timerId = setInterval(ref.current, delay)