reactjs - 反应 useEffect 和 clearInterval
问题描述
我有一个按钮,可以将名为start
true 的状态切换为 false。如果是真的,你想查看控制台日志,只要我按下停止,我就希望日志停止。
useEffect(() => {
let timePassed = 0;
let timeLeft = timeLimit;
if (start) {
const timerInterval = setInterval(() => {
timePassed += 1;
if (!start) {
console.log('stop')
clearInterval(timerInterval);
}
console.log('start')
}, 100);
}
}, [start]);
控制台永远不会停止记录start
解决方案
局部变量start
永远不会改变,即使你调用setStart
. 调用setStart
只是对再次渲染组件做出反应的指令。在该新渲染中,将创建一个新的局部变量,其 start 等于 false,但前一次渲染的效果永远不会看到。
相反,您需要的是返回一个拆解函数。当第二次调用效果时,react 会调用上一次的拆解函数。
useEffect(() => {
let timePassed = 0;
let timeLeft = timeLimit;
if (start) {
const timerInterval = setInterval(() => {
timePassed += 1;
console.log('start')
}, 100);
return () => {
console.log('stop')
clearInterval(timerInterval);
}
}
}, [start])
推荐阅读
- pandas - 使用 nd numpy 数组作为索引对 Panda 的数据帧进行分层索引
- ldap - 在 LDAP 中找不到使用其 cn 的组成员
- r - 从 R 中的文本中提取“季度”及其对应的年份
- c++ - 检查双精度值是否为 0.0 的有效方法
- c# - 具有 Oracle 数据库异步方法的 .NET Core 不会同时运行
- spring - 将对象从 HTML 模板传回控制器
- r - 尝试运行代码以更改数据集部分的单位时收到警告消息
- java - 使用服务模式和使用独立存储库 Spring Data REST 有什么区别?
- pdf - 在 adobe reader 中打开 PDF 时出现错误
- css - React Native - 居中 flexWrap 容器的内容