reactjs - 在 React 中单击按钮时如何停止计时器?
问题描述
在 reactjs 中单击我的按钮时,如何停止两个计时器。
我注意到,当我的计时器运行时,我的整个组件每次都重新渲染如何避免这部分。
export default function App() {
const [counterSecond, setCounterSecond] = React.useState(0);
const [counter, setCounter] = React.useState(120);
const [time, setTime] = React.useState("");
React.useEffect(() => {
setTimeout(() => setCounterSecond(counterSecond + 1), 1000);
setTimeout(() => setCounter(counter - 1), 1000);
}, [counterSecond , counter]);
const handletimer = () => {
setTime(counterSecond);
};
return (
<div className="App">
<div>Countdown: {counterSecond}</div>
<div>Countdown Reverse: {counter}</div>
<div>time: {time} </div>
<button onClick={handletimer}>Submit</button>
</div>
);
}
解决方案
最好的方法是添加一个state
代表工作的变量status
。即:“工作”,“暂停”并切换它。
此外,如果组件被卸载,您需要取消订阅超时以避免状态更新。
这是一个示例,您可以在其中停止和恢复计时器:
export default function App() {
const [counterSecond, setCounterSecond] = React.useState(0);
const [counter, setCounter] = React.useState(120);
const [time, setTime] = React.useState("");
const [status, setStatus] = React.useState("working");
React.useEffect(() => {
let secondCounterId;
let counterId;
if (status === "working") {
secondCounterId = setTimeout(
() => setCounterSecond(counterSecond + 1),
1000
);
counterId = setTimeout(() => setCounter(counter - 1), 1000);
}
return () => {
clearTimeout(counterId);
clearTimeout(secondCounterId);
};
}, [counterSecond, counter, status]);
const handletimer = () => {
setTime(counterSecond);
};
const stopTimers = () => {
setStatus("paused");
};
const resume = () => {
setStatus("working");
};
return (
<div className="App">
<div>Countdown: {counterSecond}</div>
<div>Countdown Reverse: {counter}</div>
<div>time: {time} </div>
<button onClick={handletimer}>Submit</button>
<button onClick={stopTimers}>Stop</button>
<button onClick={resume}>resume</button>
</div>
);
}
和一个有效的密码箱
推荐阅读
- php - Laravel 6 - 如何使用数组和输入的数据重定向回来?
- python - 停止运行 python 程序的 systemd 服务
- python - 枚举类定义过程
- python - 如何使用谷歌服务帐户设置谷歌应用脚本网络应用端点授权?
- c# - For Each Row:集合发生变化,可能无法进行枚举操作
- pdf - 我可以获得获取 PDF 中文本位置的代码吗
- google-bigquery - 错误删除后恢复管理 Google 帐户
- flutter - 导航不适用于 Firebase 动态链接 - 使用颤振
- testng - Qmetry:测试用例执行的顺序没有按照 testNG 文件中的给定顺序发生
- python - 具有来自 Pandas 中 2 个不同列的颜色的散点矩阵(没有 seaborn)