开发者问题收集

无法使用 react 和 hooks 访问嵌套 JSON。TypeErrors

2021-01-21
1267

JSON

这是 JSON 对象在状态下的样子。

{ 
  "gender": "male",
  "name": {
    "title":"Mr."
    "first":"Mike",
    "last": "Wazowski"
  },
  ...
}

React

const App = () => {
  const [user, setUser] = React.useState([]);

  React.useEffect(() => {
    axios
      .get("https://randomuser.me/api")
      .then((response) => {
        const info = response.data.results[0];
        setUser(info);
      })
      .catch((err) => {
        console.log(err);
      });
  }, []);

访问第一个 lvl 数据工作正常

return (
    <div>
      <h1>Hello, {user.gender}</h1> 
      <h1>Hello, {user.email}</h1> 
    </div>
  )

调用对象返回 Err:对象作为 React 子项无效

return (
    <div>
      <h1>Hello, {user.name}</h1>
    </div>
  )

调用嵌套数据返回 TypeError:user.name 未定义错误

return (
    <div>
      <h1>Hello, {user.name.first}</h1>
    </div>
  )

为什么我可以访问像性别这样的“第一级”数据,但不能访问像 name.first 这样的“第二级”数据?

我需要一些我不知道的特殊语法吗?

2个回答

我相信您的错误发生的时间不同 - 您将对象初始化为空数组,因此您可以访问第一级字段(将未定义),但不能访问它们的字段(因此 user.name 未定义)。然后您填充数据, user.name 成为一个对象,您不能只在 DOM 中渲染,因此您会得到 对象作为 React 子项无效 。要解决此问题,只需添加一个空检查 - <h1>Hello, {user.name && user.name.first}</h1>

Nadia Chibrikova
2021-01-21

我认为您的代码存在问题,因为您尝试使用 response.data.results[0] 而不将其转换为 JavaScript 对象。也就是说,API 的响应是 JSON,您需要将其转换为 JS 对象。

在使用 response.data.results[0] JSON 之前,您可以尝试将其解析为对象吗?

这应该可行:

const info = JSON.parse(response.data.results[0]);
10110
2021-01-21