【发布时间】:2020-11-19 05:30:56
【问题描述】:
我想更新一个多维数组。
我有这个状态变量。
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 发生变化时,我必须从一开始就做同样的事情。该组件大约有数千行代码。我在这里添加代码,可以简要说明问题。
【问题讨论】:
-
您似乎可能在一个循环中将多个更新排入队列,但是使用如此最少的代码 sn-p 很难理解您要做什么。您可以更新以包含Minimal, Complete, and Reproducible 组件代码示例吗?使用
JSON.parse(JSON.stringify(...))是克隆对象的糟糕方式,不推荐使用。看起来你的更新函数总是用tempData[0].push更新第一个嵌套数组。为什么外部数组的每个元素都只是一个双嵌套数组? -
@DrewReese
Can you update to include a Minimal, Complete, and Reproducible component code example?我添加了代码sn-p。 -
@DrewReese
JSON.parse(JSON.stringify(...))我正在寻找解决方案,所以我只是使用JSON.parse(JSON.stringify(...))进行了测试。
标签: javascript reactjs use-state