当前位置: 首页 > 知识库问答 >
问题:

反应:在对象上设置状态后,状态包含空对象,并带有值

阮鸿煊
2023-03-14

关于setState,肯定有很多问题和答案,我也试过去看,但还没有发现一个与我的问题(或解决方案)非常相似的问题(或解决方案)有用。仍然很有可能有人在处理这个问题,如果是的话,请指出,并为重复的内容道歉。

以下是功能组件的相关代码

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.log的结果:

RES.DATA如下所示:,对象{balance:10000000000000000,feeAndSplit:Array[500,20]}

在AXIOS中,状态现在是:对象{}

第一个console.log显示的数据与我预期的完全相同。(与Postman使用相同的API也会返回相同的数据。)我调用setState,调用的变量与一秒钟前日志中刚包含数据的变量完全相同,然后poof!现在它是一个空的对象。

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

我想知道这是否与在use效应中设置状态有关,但是如果有的话,我就不知所措了。例如,这个答案似乎表明,只要在use效应的末尾传入一个空数组,一切都应该很好。)

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

谢谢


共有1个答案

胡光霁
2023-03-14

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

state是一个本地常量。它永远不会改变,这不是setState试图做的。调用setState的目的是告诉响应重新呈现组件。当组件重新渲染时,将创建一个新的本地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))

},[])
 类似资料:
  • 问题内容: 我处于状态的对象数组: 我需要能够基于id属性搜索items数组,然后更新对象属性。 我可以使用id参数通过数组或在数组上获取对象。 我遇到的麻烦是更新数组,然后更新状态而不会发生突变。 此时,我有一个匹配的对象,可以使用对象传播来更新它的属性: 我的问题是我该如何更新状态,以使其覆盖初始查找操作返回的对象? 问题答案: 您的更新功能如下所示 你这样使用它 毛吧? 如果您继续以这种方式

  • 我有一个处理程序,在输入字段发生变化时触发。但是,当我将状态日志记录到控制台resData是'未定义'?这是不可能的,因为console.log(身体)确实返回结果。

  • 我想知道是否有一种方法可以使用useState()更新React中的嵌套对象状态

  • 本文向大家介绍hibernate 对象有哪些状态?相关面试题,主要包含被问及hibernate 对象有哪些状态?时的应答技巧和注意事项,需要的朋友参考一下 临时/瞬时状态:直接 new 出来的对象,该对象还没被持久化(没保存在数据库中),不受 Session 管理。 持久化状态:当调用 Session 的 save/saveOrupdate/get/load/list 等方法的时候,对象就是持久化

  • 问题内容: 对于我正在使用的插件,我必须具有如下所示的状态: 我如何在不设置其余访问权限的情况下设置hospital_id的状态? 这似乎删除了除了hospital_id之外的所有内容: 问题答案: 您有几种选择: 借助ECMA6,您可以使用对象传播建议()创建具有更新属性的对象的副本。 您可以在对象()上使用本机分配功能 或为最短的版本和原子更新: 还有一个选项是更新插件: 我建议使用第一个。

  • 对于我正在使用的插件,我必须具有如下状态: 如何在不设置其余访问权限的情况下设置hospital_id状态? 这似乎删除了一切,但hospital_id: