提问人:Thomasino73 提问时间:8/31/2023 最后编辑:AmerllicAThomasino73 更新时间:9/1/2023 访问量:59
覆盖特定的 JSON 值,但保留未覆盖的值
Overwrite specific JSON values but keep the ones that aren't overwritten
问:
我目前正在开发一个应用程序,我从 server-sent-events 接收数据。数据流在开始时发送一次所有内容,并仅更新需要更新的字段。我的问题是,如何保存原始JSON对象并仅更新更新的项目。
此时,所有项目都已更新。例如,如果我收到一个包含 2 个项目的标准 JSON 对象,并且我收到以下更新,则该对象如下所示 因此,该对象被空项目覆盖,因为它不存在。{color: "black", id: 0}
{ id: 1 }
{color: "", id: 1}
const [initialUserData, setInitialUserData] = useState({
id: 1,
name: 'Pol',
color: 'black',
});
useEffect(() => {
const unsubscribe = sse.subscribe('playerupdate', (d: any) => {
const receivedData = d;
const updatedUserData = { ...initialUserData, ...receivedData }; // Create a copy of initialUserData
// Iterate over the keys in receivedData and update updatedUserData
for (const key in receivedData) {
if (receivedData.hasOwnProperty(key)) {
updatedUserData[key] = receivedData[key];
console.log(key);
}
}
updateUserData(updatedUserData);
if (updatedUserData.PlayerId > 0) {
setSessionState(true);
} else if (updatedUserData.PlayerId === 0) {
setSessionState(false);
}
});
return unsubscribe;
}, []);
我正在使用 ReactJs Context API,这对我来说是新的,但它似乎不是问题,因为它可以完美地更新。
答:
1赞
AmerllicA
8/31/2023
#1
看看我的版本:
const [initialUserData, setInitialUserData] = useState({
id: 1,
name: 'Pol',
color: 'black',
});
useEffect(() => {
const unsubscribe = sse.subscribe('playerupdate', (receivedData: any) => {
// Merge the receivedData into the initialUserData
const updatedUserData = { ...initialUserData, ...receivedData };
updateUserData(updatedUserData);
setSessionState(updatedUserData.PlayerId > 0);
});
return unsubscribe;
}, []);
你不需要那个循环。我在 .当值为布尔值时,无需添加大量代码,您可以直接使用它们而不是使用 .for in
setSessionState
if-then else
评论
0赞
Thomasino73
8/31/2023
感谢您的建议和问题编辑!流程如下。在收到实际数据之前,“initialUserData”就像一个占位符。此过程有效,实际数据显示在代码中,但一旦颜色项更新,所有内容都会被 initialUserData 占位符变量覆盖,但会随着更新而覆盖。实际数据已经消失,仅在 30 秒后更新。它们是保存此实际数据的一种方式,还是始终返回到占位符数据?
0赞
AmerllicA
8/31/2023
@ThomasDierickx,兄弟,你在说什么?实际数据来自API,好吧。然后,通过使用状态的 setter 函数,它将被替换为对占位符的合并,这意味着一些键将被更新。好吧,那为什么实际数据会消失呢?这 30 秒是什么?
0赞
Thomasino73
8/31/2023
实际数据已消失,因为它不断被 initialUserData 值覆盖
0赞
AmerllicA
8/31/2023
这是否覆盖了您的逻辑?还是无意中发生的?
0赞
Thomasino73
8/31/2023
不经意间。当我设置 SSE 流时,我收到 1 个对象,应该存储这个对象,从中我只接收更新,这些更新应该反映到最初收到的对象上。对象中未更新的项目应保留在那里,不会消失
-1赞
Thomasino73
9/1/2023
#2
我通过制作一个普通的 let 变量而不是 useState 并更新它一次来修复它。从那时起,updatedUserData 接收更新并将两个变量放在一起!
let initialUserData = {
id: 1,
name: 'Pol',
color: 'black'
};
useEffect(() => {
const unsubscribe = sse.subscribe('playerupdate', (receivedData: any) => {
if (receivedData.color === "white") {
initialUserData = receivedData
}
const data = { ...initialUserData, ...receivedData };
updateUserData(data);
setSessionState(data.PlayerId > 0);
return unsubscribe;
}, []);
评论