reactjs - How to fetch data after a specific Interval with useState, useEffect and useCallback in React with proper dependencies
问题描述
I am trying to fetch Cameras from after a specific interval.
Once I fetch all cameras, I set camera in local state but if I try to console.log
it I get nothing
const [allCameras, setAllCameras] = useState()
const fetchAllCameras = useCallback(async () => {
try {
const res = await getAllCameras();
if(res.data.status_code === 0 && res.data.data){
setAllCameras(res.data.data)
}
} catch (err) {
console.error(err);
}
}, [])
const _fetchData = useCallback(async () => {
fetchAllCameras()
if(allCameras){
// Nothing gets logged
console.log("allCameras", allCameras)
}
// If I add allCameras as a dependency it triggers an infinite loop
}, [fetchAllCameras])
useEffect(() => {
_fetchData();
const intervalID = setInterval(() => {
_fetchData();
}, FETCH_INTERVAL * 1000);
return () => clearInterval(intervalID);
}, [_fetchData]);
解决方案
尝试对您的代码应用一些修复:
- 每个人都
useEffect
应该有一个单一的责任。 useCallback
这里没有必要争论(你想记住什么?你测量了性能问题?)- value有一个闭包
allCameras
,将其移动到 separateuseEffect
。
const [allCameras, setAllCameras] = useState();
const fetchData = () => {
const fetchAllCameras = async () => {
try {
const res = await getAllCameras();
if (res.data.status_code === 0 && res.data.data) {
setAllCameras(res.data.data);
}
} catch (err) {
console.error(err);
}
};
fetchAllCameras();
};
// On Mount
useEffect(() => {
fetchData();
}, []);
// Interval
useEffect(() => {
const intervalID = setInterval(() => {
fetchData();
}, FETCH_INTERVAL * 1000);
return () => clearInterval(intervalID);
}, []);
// Check state
useEffect(() => {
console.log(allCameras);
}, [allCameras]);
阅读更多useEffect
用例。
推荐阅读
- active-directory - 通过powershell将多个组的管理更改为用户的经理
- linux - Bash 脚本可以连续执行二进制文件,即使二进制文件崩溃
- r - 如何创建一个对重复生成的随机数求和的向量?
- jquery - jQuery:比较二维数组和一维数组
- sql - (Presto)SQL:按列“A”和“B”以及计数列“C”分组,但也包括仅按“A”分组的“C”计数
- jquery - 仅在选择两个下拉元素时触发更改事件
- laravel - Pikaday 绑定到类型提示属性 livewire
- django - 我应该为我的 POS Web 应用程序使用构建 API 吗?
- python - 将列中的值重复 n 次
- javascript - 为 HTML 中的输入字段分配动态值