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(参考电流,延迟)
toconst 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)