【问题标题】:React: state contains empty object after setState on object with valuesReact:状态在具有值的对象上的 setState 之后包含空对象
【发布时间】:2020-11-25 16:15:31
【问题描述】:

肯定有 lot of questions 和关于 setState 的答案,我已经尝试查看它们,但没有找到与我的非常相似的问题(或解决方案)有用。仍然很有可能有一个可以处理这个问题,如果是这样,请指出,并为重复道歉。

这是来自功能性 React 组件的相关代码:

const [ state, setState ] = useState({})

useEffect(data => {
     const getFromServer = axios.get('http://localhost:3030/poolInfo')
        .then(res => {
            console.log("RES.DATA LOOKS LIKE THIS:, ", res.data);
            setState(res.data);  // I also tried setState({...res.data})
            console.log("IN AXIOS, STATE IS NOW: ", state);
        })
        .catch (err => console.error("YO YOU GOT AN ERROR IN AXIOS ", err))

},[])

下面是上面两个console.logs的结果:

RES.DATA LOOKS LIKE THIS:, Object { balance: 1000000000000000000, feeAndSplit: Array [500, 20] }

IN AXIOS, STATE IS NOW: Object { }

第一个console.log 显示的数据完全符合我的预期。 (使用 Postman 访问相同的 API 也会返回相同的数据。)我在字面上调用 setState 上的变量是一秒钟前刚刚在日志中有数据的变量,然后噗!现在它是一个空对象。

我认为console.log 本身可能对res.data 做了一些奇怪的事情,所以我也尝试注释掉第一个console.log,但仍然得到相同的结果。

我想知道这是否与在useEffect 中设置状态有关,但如果是这样,我就不知所措了。 (比如this的答案似乎表明只要在useEffect的末尾传入一个空数组,一切都应该没问题。)

res.data 发生了什么事,和/或如何设置它的状态?

谢谢!

【问题讨论】:

  • setState 是异步方法,您在设置之后打印值。你可以根据状态值做一些任务,你会看到 ui 的变化。
  • 我正在执行任务,但没有看到 UI 的变化。我没有把那部分代码放进去,因为我一开始并不认为它是相关的。我想我可能搞错了这个问题。

标签: reactjs setstate use-effect


【解决方案1】:

一切正常,只是您将日志语句放在了无用的地方。

state 是一个本地常量。它永远不会改变,这不是setState 想要做的。调用 setState 的目的是告诉 react 重新渲染组件。当组件重新渲染时,将创建一个新的本地 const,它将具有该新值。新渲染中的代码可以访问该新值,但旧渲染中的代码仍然引用之前的值。

因此,如果您想验证它是否使用新值重新渲染,请将 log 语句放在组件的主体中,以便在渲染时记录:

const [ state, setState ] = useState({})
console.log("Rendering with: ", state);

useEffect(data => {
     const getFromServer = axios.get('http://localhost:3030/poolInfo')
        .then(res => {
            console.log("RES.DATA LOOKS LIKE THIS:, ", res.data);
            setState(res.data);
        })
        .catch (err => console.error("YO YOU GOT AN ERROR IN AXIOS ", err))

},[])

【讨论】:

  • 你是 100% 正确的,新的 console.log 在那里显示了数据,但它仍然没有在 UI 中呈现。我将把问题留在这里并接受答案,以防其他人遇到这个问题,并且可能会打开另一个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2020-10-01
  • 2019-12-09
  • 1970-01-01
  • 2018-10-14
  • 2019-05-31
相关资源
最近更新 更多