javascript - Javascript setInterval 未检测到全局变量更改(React Native)
问题描述
我正在开发一个用于与 BLE 设备通信的 React Native 应用程序。为了跟踪连接是否仍然建立,我在组件中使用了一个状态。
const [isConnected, setIsConnected] = useState(props.route.params.isConnected || false);
在我的useEffect
钩子中,我开始一个间隔来重复读取我的 BLE 设备的状态,如下所示:
useEffect(() => {
AppState.addEventListener('change', onAppStateChange);
updateStatusRepeatedly.current = setInterval(readStatus, 5000);
return () => {
AppState.removeEventListener('change', onAppStateChange);
clearInterval(updateStatusRepeatedly.current);
};
}, []);
该readStatus
函数每 5 秒调用一次,按预期工作。但是不应该执行的内容。所以我把它包装在一个基于isConnected
变量的条件语句中。
const readStatus = () => {
if (isConnected) {
readAddedCharge();
readPowerMeasurement();
}
};
每次都会执行内容。即使isConnected
变量设置为假。我不明白为什么,因为其他功能和组件isConnected
考虑得当。
知道为什么其他函数和组件会注册 的更改isConnected
,但readStatus
称为计时器的函数不会?
解决方案
看来这是一个 React 的函数组件。让我们做一个最小的例子:
function MyComp() {
const [foo, setFoo] = useState(0);
useEffect(() => {
setInterval(() => {
console.log(foo); // this will always show 0
setFoo(foo + 1);
}, 5000);
}, []);
}
这是因为在函数的范围内,foo
是一个const
永远不会改变的。“更改” foo 意味着使用新值再次运行该函数,foo
无论如何您都不会使用它,因为useEffect(..., [])
仅在第一次渲染时调用。
可能的解决方案:
- 清除并重新创建每个组件渲染的间隔
- 存储该值,
useRef
以便readStatus
从第一次渲染开始始终具有对最新值的引用
推荐阅读
- javascript - ES6,将函数中的所有破坏参数作为一个对象
- database - 跟踪 API 信用的架构?
- android - 如何为我的 Android 应用使用不同的 TTS 语音?
- selenium - 为所有浏览器窗口禁用“选择证书”(ssl)
- php - Laravel刀片组件,嵌套属性不转发
- apache-kafka - kafka消费者在重新平衡时获取不同的偏移量
- python - Python:如何使用类向字典添加信息,然后打印添加的字典条目的键和值
- symfony - 验证 CheckboxType symfony
- html - html表格需要针对不同的屏幕进行调整
- c# - 如何在选项卡控件中向选项卡页添加徽章