Javascript 将不同的值返回到简单控制台日志

Javascript 将不同的值返回到简单控制台日志,javascript,json,reactjs,state,stringify,Javascript,Json,Reactjs,State,Stringify,我正在尝试使用本地存储在React中创建一个非常基本的todo应用程序,并使用一组对象来存储数据。这似乎可以很好地加载信息,但无论我做什么,似乎都无法更新本地存储 我开始回溯,发现在我的handleSave函数之后,如果我将this.state.todoData记录到控制台日志中,我会得到正确的更新值。如果在控制台日志之后立即尝试记录JSON.stringify(this.state.todoData),它将以stringify形式返回旧数据,而不是更新的数据。这甚至是在我使用本地存储之前 我无

我正在尝试使用本地存储在React中创建一个非常基本的todo应用程序,并使用一组对象来存储数据。这似乎可以很好地加载信息,但无论我做什么,似乎都无法更新本地存储

我开始回溯,发现在我的
handleSave
函数之后,如果我将
this.state.todoData记录到控制台日志中,我会得到正确的更新值。如果在控制台日志之后立即尝试记录
JSON.stringify(this.state.todoData)
,它将以stringify形式返回旧数据,而不是更新的数据。这甚至是在我使用本地存储之前

我无法理解为什么控制台日志
this.state.todoData
vs
JSON.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
显示。如果引用的对象发生更改,则控制台记录的对象也会发生更改

但是,另一方面,当u
JSON.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一起工作的方式访问更新的状态?虽然我同意所有这些,但这里的问题是如何处理状态更新