【发布时间】:2019-10-28 21:56:30
【问题描述】:
我希望一个组件每 5 秒重新渲染一次,并在相应的索引处显示数组,已知数组长度正好是 10。
这是我到目前为止所做的:
const GameCard = ({ gameArray, startGame }) => {
const [arrayIndex, setArrayIndex] = useState(0);
let {questionWord} = gameArray[arrayIndex] ;
useEffect(() => {
if(!startGame) return;
let timer = setTimeout(() => {
if(arrayIndex === 9) return; //is this valid ?
setArrayIndex(arrayIndex +1)} , 1500)
return () => {
clearTimeout(timer)
}
}, [arrayIndex ,startGame]);
return (<div>{questionWord}</div>)
startGame 是一个布尔属性,在用户点击时会发生变化。
现在,这是可行的,但正如您所见,我基于 2 个变量触发了 useEffect,当我到达数组末尾时,我将在 setTimeout 内返回,从而阻止 arrayIndex 更新。
这感觉很老套,我该如何改进我的异步 useEffect? 当我们从 setTimeout 函数或 useEffect 返回时会发生什么?
【问题讨论】:
-
虽然
setTimeout的第一个参数的返回值被忽略,但它用于更快地完成函数(=> 是的,它是有效的)。并且从useEffect返回的函数在卸载组件之前执行,并且在再次执行相同的 useEffect 之前执行(因此在新的 setTimeout 之前调用 clearTimeout)。
标签: reactjs react-hooks