reactjs - setInterval 和 React 功能组件
问题描述
我有一个关于使用setInterval
内部功能组件和上述组件内部功能行为的问题。
我有以下代码(剥离并简化以仅显示问题):
let timerInterval;
const ModuleAssignedUtils = (props) => {
const [timer, setTimer] = useState(0);
updateTimer = () => {
let timer_tmp;
if (timer <= 0) {
clearInterval(timerInterval)
setTimer(0)
setButtonPressed(false);
}
else {
timer_tmp = timer - 1;
setTimer(timer_tmp)
}
}
const locateVehicle = () => {
if (!buttonPressed) {
setButtonPressed(true);
setTimer(10);
timerInterval = setInterval(() => {
updateTimer();
}, 1000);
}
}
return (
...
<ButtonContainer timer={timer}
noButtonLoading
onEvent={locateVehicle} />
...
)
}
这段代码实际上完成了这项工作。用户按下按钮,触发该功能locateVehicle
,该功能又将定时器状态设置为 10,然后使用该updateTimer
功能启动间隔。
但是,一旦我将updateTimer
定义更改为包含const
or function
,这段代码就会停止工作。状态已设置,但updateTimer
始终使用 调用timer = 0
,因此它不知道状态已更改。
我很难理解在没有任何正确声明的情况下声明函数与使用const
orfunction
关键字正确声明函数之间的区别。如果有人可以向我解释这种行为,将不胜感激。
PS 我已经重构了这个组件,并useInterval
按照 Dan Abramov 的建议使用了自定义钩子,所以一切都很好。只是试图理解这种特殊情况下行为背后的逻辑。
提前致谢!
解决方案
它停止工作的原因是您的上下文(旧的this
)没有设置。
当您写下箭头函数表达式时,例如 your updateTimer
,它会自动绑定您的上下文,就像使用bind
function一样。
如果在 setInterval 方法中声明函数,您将遇到同样的问题。
推荐阅读
- javascript - 将 CSV 文件数据加载到 HTML 表中
- github - 纱线:错误:连接 ECONNREFUSED 127.0.0.1:443
- sql-server - 同一逻辑语句上的执行计划更改
- excel - 减去部分单元格
- c# - 将 XmlDocument 转换为对象列表
- flutter - 如何将 TabBar 的选项卡放在中间,然后单击下一个选项卡,它开始向左移动?
- groovy - Groovy:Math.floor 返回非整数(0.0),需要始终转换为 int 吗?
- python - TypeError: x and y must have the same dtype, got tf.float32 != tf.int64 in custom loss function keras
- c# - 如何发送 Messaging API 的 post 请求
- reactjs - 如何为基于 react-bootstrap 的 Column 组件添加平滑的滑动过渡效果?