javascript - 没有使用 useState() 更新反应状态
问题描述
我想更新一个多维数组。
我有这个状态变量。
const [travelledDataSet, setTravelledDataSet] = useState(JSON.parse(JSON.stringify(solidDataSet)));
实体数据集的结构最初是。
export const solidDataSet = [
[
[76.92025126928692, 31.815485031139886]
],
[
[76.92737521643127, 31.76427071949966]
],
[
[76.91587390417601, 31.75230203493911]
]
]
一旦触发更新功能,我必须定期更新此数据。
const update=()=>{
if(i>=dataSet[0].length) return;
let tempData = JSON.parse(JSON.stringify(travelledDataSet));
tempData[0].push(dataSet[0][i]);
setTravelledDataSet(tempData);
i++; // increment to next position
setTimeout(update,100)
}
虽然状态更新,但travelledDataSet[0]
大小仍然为 2。而且,travelledDataSet[0][1]
只是在更新。
例如
// first__update__is
// -- travelledDataSet[0] --
[76.92025126928692, 31.815485031139886]
[77.06221522802589, 31.75536733328293]
// in__second__update
// --travelledDataSet[0]--
[76.92025126928692, 31.815485031139886]
[77.0603269528807, 31.75317784482199] -- only this is being updated each time.
为了检查为什么这不起作用,我在更新函数之外创建了另一个变量(不是反应状态)。
let ar=JSON.parse(JSON.stringify(travelledDataSet))
const update=()=>{
if(i>=dataSet[0].length) return;
let tempData = JSON.parse(JSON.stringify(travelledDataSet));
tempData[0].push(dataSet[0][i]);
ar[0].push(dataSet[0][i]);
console.log("AR: ",ar[0],"Data:",travelledDataSet[0]); // ---- this is updating
setTravelledDataSet(tempData);
i++; // increment to next position
setTimeout(update,10)
}
功能完成后,此代码console.log("AR: ",ar[0],"Data:",travelledDataSet[0])
打印。
您可以在下图中看到,ar[0]
长度为 58,而travelledDataSet[0]
长度仅为 1。
即使这也不起作用
setTravelledDataSet(JSON.parse(JSON.stringify(tempData)));
可重现的代码:
// it will render solid route indecating traveled route
const [travelledDataSet, setTravelledDataSet] = useState(JSON.parse(JSON.stringify(solidDataSet)));
// update route -- only in development for simulation purpose
let i = 1;
const update=()=>{
if(i>=dataSet[0].length) return;
let tempData = JSON.parse(JSON.stringify(travelledDataSet));
tempData[0].push(dataSet[0][i]);
setTravelledDataSet(JSON.parse(JSON.stringify(tempData)));
i++; // increment to next position
setTimeout(update,10)
}
useEffect(()=>{
setTravelledDataSet(JSON.parse(JSON.stringify(solidDataSet)));
if(display)
update()
},[display])
每当display
发生变化时,我必须从一开始就做同样的事情。该组件大约有数千行代码。我在这里添加可以简要解释问题的代码。
解决方案
你为什么要进行递归定时调用来更新;setTimeout(update, 10)
在里面打电话update()
?这个成语我以前没见过,看起来很腥。也许看看setInterval
?
还要考虑useEffect
使用钩子来处理数据更改时的副作用,而不是箭头函数。
我认为你应该重构这段代码。很难阅读。
推荐阅读
- python - Python数据类型不能在while循环中改变
- mysql - 使用连接或子查询更新表 MYSQL 中的每一行
- android - 当我说要导入时(无法解析符号 V7)
- c - 使用变量参数不能打印正确的整数
- javascript - 文档参考.get(
) 不工作 - haskell - 在 haskell 中,为什么 min 8.0 8 = 8.0 和 max 8.0 8 = 8.0
- python - Flask:如何在 Flask、celery 或 python 多处理模块中创建一个或多个耗时的进程
- javascript - 为什么这个箭头函数绑定“this”的方式与类函数指针不同?
- node.js - cors 出现在 React 而不是 Node.js 为什么?
- html - 带有 HTML 控件的 javascript 3d