【发布时间】:2021-04-05 21:53:39
【问题描述】:
let updateTimer: number;
export function Timer() {
const [count, setCount] = React.useState<number>(0);
const [messages, setMessages] = React.useState<string[]>([]);
const start = () => {
updateTimer = setInterval(() => {
const m = [...messages];
m.push("called");
setMessages(m);
setCount(count + 1);
}, 1000);
};
const stop = () => {
clearInterval(updateTimer);
};
return (
<>
<div>{count}</div>
<button onClick={start}>Start</button>
<button onClick={stop}>Stop</button>
{messages.map((message, i) => (
<p key={i}>{message}</p>
))}
</>
);
}
代码示例:https://codesandbox.io/s/romantic-wing-9yxw8?file=/src/App.tsx
代码有两个按钮 - 开始和停止。
-
Start 调用
setInterval并保存间隔 id。计时器设置为 1 秒(1000 毫秒)。 -
Stop 在间隔 id 上调用
clearInterval。
区间id在组件外声明。
间隔回调函数增加一个计数器并将called 消息附加到 UI。
当我单击“开始”时,我希望计数器每秒递增一次,并在按钮下方附加一条相应的 called 消息。
实际发生的情况是,在单击“开始”时,计数器只增加一次,called 消息也是如此。
如果我再次单击“开始”,计数器会增加并随后重置为之前的值。
如果我继续点击“开始”,计数器会继续递增并重置为之前的值。
谁能解释这种行为?
【问题讨论】:
标签: javascript reactjs ecmascript-6 setinterval