如何在反应中使用 setInterval?
How to use setInterval in react?
我正在尝试为打字游戏制作一个简单的 setInterval 函数,但它总是出现故障,具体取决于我的语法,或者根本没有像现在这样更新。
如何让它每秒更新一次并调用 if 语句中的函数?
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter(counter - 1);
if (counter === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
setCounter(10);
}
}, 1000);
}, []);
*********编辑***************
这就是我现在所拥有的。第一个答案解决了计数器不递减的异步问题,但我不得不将 if 语句移到 useEffect 之外以更正我认为是由同一问题引起的问题。
useEffect(() => {
let timer = setInterval(() => {
setCounter( counter => counter - 1);
}, 1000);
}, []);
if (counter == 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
setCounter(10);
}
在setCounter
函数中使用回调函数。当您在异步函数中调用状态更新时。根据之前的状态更新状态是个好习惯。
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter(counter => {
const updatedCounter = counter - 1;
if (updatedCounter === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
}
return updatedCounter;
}); // use callback function to set the state
}, 1000);
return () => clearInterval(timer); // cleanup the timer
}, []);
之前的答案没有考虑其他状态 - wordIndex 和 lives 并且没有包括明确的间隔
建议在 setIntervals 中使用回调 setState 并在下次调用 useEffect 时清除间隔
const [counter, setCounter] = React.useState(10);
React.useEffect(() => {
let timer = setInterval(() => {
// It's advisable to use callback setState inside setIntervals
setCounter(prev => {
if (prev !== 0) return prev - 1;
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
});
}, 1000);
// And clear the interval next useEffect call
return () => clearInterval(timer);
}, [wordIndex, lives]);
之前的答案没有考虑到计数器值不会立即更新。由于未清除 setInterval,它们也容易发生内存泄漏。
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter( counter => {
const nC = counter - 1;
if (nC === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
}
return nC;
});
}, 1000);
return () => clearInterval(timer);
}, []);
我正在尝试为打字游戏制作一个简单的 setInterval 函数,但它总是出现故障,具体取决于我的语法,或者根本没有像现在这样更新。
如何让它每秒更新一次并调用 if 语句中的函数?
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter(counter - 1);
if (counter === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
setCounter(10);
}
}, 1000);
}, []);
*********编辑***************
这就是我现在所拥有的。第一个答案解决了计数器不递减的异步问题,但我不得不将 if 语句移到 useEffect 之外以更正我认为是由同一问题引起的问题。
useEffect(() => {
let timer = setInterval(() => {
setCounter( counter => counter - 1);
}, 1000);
}, []);
if (counter == 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
setCounter(10);
}
在setCounter
函数中使用回调函数。当您在异步函数中调用状态更新时。根据之前的状态更新状态是个好习惯。
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter(counter => {
const updatedCounter = counter - 1;
if (updatedCounter === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
}
return updatedCounter;
}); // use callback function to set the state
}, 1000);
return () => clearInterval(timer); // cleanup the timer
}, []);
之前的答案没有考虑其他状态 - wordIndex 和 lives 并且没有包括明确的间隔
建议在 setIntervals 中使用回调 setState 并在下次调用 useEffect 时清除间隔
const [counter, setCounter] = React.useState(10);
React.useEffect(() => {
let timer = setInterval(() => {
// It's advisable to use callback setState inside setIntervals
setCounter(prev => {
if (prev !== 0) return prev - 1;
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
});
}, 1000);
// And clear the interval next useEffect call
return () => clearInterval(timer);
}, [wordIndex, lives]);
之前的答案没有考虑到计数器值不会立即更新。由于未清除 setInterval,它们也容易发生内存泄漏。
const [counter, setCounter] = useState(10);
useEffect(() => {
let timer = setInterval(() => {
setCounter( counter => {
const nC = counter - 1;
if (nC === 0) {
setWordIndex(wordIndex + 1);
setLives(lives - 1);
life.play();
return 10;
}
return nC;
});
}, 1000);
return () => clearInterval(timer);
}, []);