javascript - 模糊侦听器的回调无法识别状态值
问题描述
在我的反应原生组件中,我有两个按钮
<Button
title='Start moving'
onPress={() => {
setIntervalId(startMoving(addLocation))
}}
/>
<Button
title='Finish moving'
onPress={() => {
stopMoving(intervalId);
/>
startMoving 和 stopMoving 在哪里
export const startMoving = () => {
var intervalId = setInterval(() => {
//… Do something
}, 1000);
return intervalId;
};
export const stopMoving = (intervalId) => {
clearInterval(intervalId);
};
可以看到,startMoving返回setInterval返回的intervalId,并将其保存在一个状态
const [intervalId, setIntervalId] = useState(0)
当我按下完成移动按钮时,它会使用 intervalId 的值调用 stopMoving。在这里,它工作得很好
但是我想在用户导航到另一个组件时停止移动,然后,我声明了事件模糊:
useEffect(() => {
const blurOff = navigation.addListener('blur', stopMovingId);
return () => {
blurOff;
};
}, [navigation]);
其中 stopMovingId 基本上使用 intervalId 的值调用 stopMoving
const stopMovingId = () => {
stopMoving(intervalId)
}
(我不知道如何设置 navigation.addListener('blur', stopMoving... 应该使用参数 intervalId 调用 stopMoving)
问题是当blur事件执行 stopMovingId() 时,它作为intervalId发送的值是 0,而不是状态intervalId的值
拉斐尔
解决方案
好的,我认为这是一个范围问题。当useEffect
被调用时,它会将处理程序设置为stopMovingId
具有对该函数的引用intervalId
但对该函数的引用以及随后该状态值不会在状态更改时更新。
请尝试以下方法:
useEffect(() => {
const blurOff = navigation.addListener('blur', () => stopMoving(intervalId));
return () => {
blurOff();
};
}, [navigation, intervalId]);
推荐阅读
- scala - 为什么特征不能有带有上下文边界的参数
- java - 重载重写的继承方法
- mysql - 如何修复 Sequelize 嵌套包括不使用限制/订单/属性?
- maven-ear-plugin - 与 OutputFileNameMapping 等效的 FileNameMapping “no-version-for-ejb”
- android - 更新 Android Studio 后未显示通知
- c# - ASP.NET 会话被覆盖
- node.js - poolSize 达到指定大小,导致应用程序急剧变慢
- python - 来自逆 (CDF) 变换采样的错误分布
- android - 如何修复导致应用程序崩溃的对话框片段错误
- python - conda-build 使用旧的(陈旧的)setup.py