Javascript 将不同的值返回到简单控制台日志
我正在尝试使用本地存储在React中创建一个非常基本的todo应用程序,并使用一组对象来存储数据。这似乎可以很好地加载信息,但无论我做什么,似乎都无法更新本地存储 我开始回溯,发现在我的Javascript 将不同的值返回到简单控制台日志,javascript,json,reactjs,state,stringify,Javascript,Json,Reactjs,State,Stringify,我正在尝试使用本地存储在React中创建一个非常基本的todo应用程序,并使用一组对象来存储数据。这似乎可以很好地加载信息,但无论我做什么,似乎都无法更新本地存储 我开始回溯,发现在我的handleSave函数之后,如果我将this.state.todoData记录到控制台日志中,我会得到正确的更新值。如果在控制台日志之后立即尝试记录JSON.stringify(this.state.todoData),它将以stringify形式返回旧数据,而不是更新的数据。这甚至是在我使用本地存储之前 我无
handleSave
函数之后,如果我将this.state.todoData记录到控制台日志中,我会得到正确的更新值。如果在控制台日志之后立即尝试记录JSON.stringify(this.state.todoData)
,它将以stringify形式返回旧数据,而不是更新的数据。这甚至是在我使用本地存储之前
我无法理解为什么控制台日志this.state.todoData
vsJSON.stringify(this.state.todoData)
会给我带来不同的数据集
以下是我的handleSave函数:
updateLocalStorage () {
const newState = JSON.stringify(this.state.todoData)
localStorage.setItem('todoDataString', newState)
}
handleSave(idNum、title、due、description){
this.setState(prevState=>({
todoData:prevState.todoData.map(obj=>
obj.id==idNum
?对象分配(obj{
InEdit模式:false,
标题:标题,,
到期:到期,,
描述:描述
})
:obj
)
}))
console.log(this.state.todoData)
log(JSON.stringify(this.state.todoData))
}
this.state.todoData是对象。通过引用传递,console.log
显示。如果引用的对象发生更改,则控制台记录的对象也会发生更改
但是,另一方面,当uJSON.stringify
it时,它会变成字符串,并通过值传递。所以,它没有改变
const Obj = {
a: 1,
b: 58,
};
console.log(Obj);
Obj.a = 484151
console.log(Obj);
他们两个都记录了同样的事情
请参见由于状态未立即更新,因此应在成功完成后更新/记录值,例如在setState函数的回调中
this.setState(prevState => ({
todoData: prevState.todoData.map(obj =>
obj.id === idNum ?
Object.assign(obj, {
inEditMode: false,
title: title,
due: due,
description: description
}) :
obj
)
}), () => {
console.log(this.state.todoData)
console.log(JSON.stringify(this.state.todoData))
})
(代表问题作者发布解决方案,将其移动到答案空间)
问题解决了!我必须创建一个新的回调函数,并将其作为参数传递给setState
。我没有意识到setState不会立即更新,因此它总是感觉“落后一步”
更新代码:
this.setState(
prevState => ({
todoData: prevState.todoData.map(obj =>
obj.id === idNum
? Object.assign(obj, {
inEditMode: false,
title: title,
due: due,
description: description
})
: obj
)
}),
this.updateLocalStorage
)
}
以及updateLocalStorage
功能:
updateLocalStorage () {
const newState = JSON.stringify(this.state.todoData)
localStorage.setItem('todoDataString', newState)
}
React的诀窍在于,状态不会立即更新,只是为了补充这个答案:日志之所以让人困惑,是因为浏览器的日志使用了引用。当记录的对象发生更改时,它们有时可能会向您显示更新的值,而不是记录时的状态“因为状态没有立即更新”我想这是我怀疑的情况,但也是我不完全理解的部分。我在谷歌上搜索“is stringify async”之类的东西,但我显然更关注stringify而不是事物的状态方面,因为stringify对我来说是相当新的。据我所知,因此我可以将localStorage作为setState函数回调的一部分进行更新?也可以作为更新:我尝试了您推荐的代码,但情况仍然相同。您是否也在其他地方更新状态?我不能说我100%理解您的意思,即使在阅读了您链接的内容之后(我仍然是一名学生,很多事情都超出了我的理解范围)但我想不管怎样,自然的下一个问题是:我如何以一种与stringify一起工作的方式访问更新的状态?虽然我同意所有这些,但这里的问题是如何处理状态更新