它是react alpha版本,里面有钩子。我正在尝试编写一个简单的计时器,但是有些东西不能正常工作。当我按下stop时,计时器ID仍然为空,即使它应该在按下start后更新。
function Timer() {
const [timer, setTimer] = useState({
id: null,
seconds: 0,
started: new Date().getTime()
});
let timerId = null;
const incrementSeconds = () => {
const now = new Date().getTime();
const updated = parseInt((now - timer.started) / 1000, 10);
setTimer({ ...timer, seconds: updated });
};
const start = () => {
const myId = setInterval(incrementSeconds, 1000);
timerId = myId;
console.log(timerId);
setTimer({
id: myId,
seconds: 0,
started: new Date().getTime()
});
};
const stop = () => {
// for some reason both timer and timerId are null
console.log(timer, timerId);
clearInterval(timer.id);
setTimer({ ...timer, seconds: 0 });
};
return (
<div>
<button onClick={start}>Start!</button>
<button onClick={stop}>Stop</button>
<h2>Seconds: {timer.seconds}</h2>
</div>
);
}
问题是,为什么timerID既在变量中,又在状态为null?我遗漏了什么?
发布于 2019-01-04 03:32:27
当你调用你的setState
函数时,如果你想根据之前的状态更新状态,你必须传递一个函数,在你的例子中,这个函数应该叫做setTimer
:
setTimer(prevState => ({ ...prevState, seconds: updated }));
https://stackoverflow.com/questions/54028579
复制相似问题