【问题标题】:Cannot read property 'xxx' of undefined - using axios无法读取未定义的属性“xxx”-使用 axios
【发布时间】:2020-04-15 16:00:10
【问题描述】:

我在访问 api 返回的一些数据时遇到了问题。 当我像这样使用 setPosts(data) 分配数据时

useEffect(() => {


   axios.get("https://api.randomuser.me/")
   .then(res => {
     console.log(res)
     const data = res.data.results["0"]
     setPosts(data) })




 },[])

到这里:const[posts,setPosts] = useState({data: []})

我可以在<div>{posts.gender}</div>中使用它

但是当我尝试降低一步时,<div>{posts.name.first}</div>,我得到了标题中的错误。 当我检查控制台时,我可以看到所有数据都在那里。

谢谢

【问题讨论】:

    标签: javascript reactjs axios


    【解决方案1】:

    在您的效果中,您正在将一个描述用户的对象设置为您的状态posts,例如

    {
      gender: "female",
        name: {
        title: "Miss",
        first: "Nicoline",
        last: "Løvli"
      },
      location: {
      ...
    }
    

    但是,当您在 const[posts,setPosts] = useState({data: []}) 中创建状态时 - 您将对象 {data: []} 设置为 posts 作为默认值。

    在您的第一次渲染期间,尚未从请求中检索到用户的数据,因此该组件仍在使用{data: []}

    <div>{posts.gender}</div> 被渲染时——它并没有失败,因为在这种情况下posts.gender 值只是undefined——你试图从对象{data: []} 访问字段gender。 所以它呈现一个空的div

    <div>{posts.name.first}</div> 尝试渲染的同时-posts.name 也只是undefined,而您基本上是在尝试从undefined 访问字段first

    【讨论】:

    • 谢谢。知道你写了什么,我可以添加 if 子句:
      {!posts.gender ? (
      loading...
      ) : (
      {posts.name.first}
      )}
      ... 所以如果帖子是空的,它会写 loading.. for一瞬间,然后它就可以正确渲染了……不过我觉得这个解决方案有点脏,你能推荐一个更好的吗?
    • @PeterSlanina 起初我建议不要将{data: []} 设置为帖子,但null 或空对象(有data 字段令人困惑,设置后它会消失来自请求的真实数据)。其次 - 最好不要在访问posts.name.first 时检查posts.gender,而是检查posts.name。你也可以写<div>{posts.name ? posts.name.first : 'loading...'}</div>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2017-09-05
    • 2019-02-05
    • 2021-11-14
    • 2019-07-28
    • 2017-04-23
    • 2021-12-10
    相关资源
    最近更新 更多