【问题标题】:Calling an API With useEffect . when Trying to mapping user it is saying TypeError: Cannot read property 'map' of undefined使用 useEffect 调用 API。当尝试映射用户时,它说 TypeError: Cannot read property 'map' of undefined
【发布时间】:2021-02-27 18:04:31
【问题描述】:
import logo from './logo.svg';
import './App.css';
import { useEffect, useState } from 'react';
import User from './components/User/User';

function App() {
  const [user, setUser] = useState([]);
  useEffect(() => {
    // Create an scoped async function in the hook
    async function loadData() {
      const response = await fetch("https://randomuser.me/api/?results=10");
      const data = await response.json();
      setUser(data.results);
    }

    loadData()
  }, [])

  console.log(user)

  return (
    

    
    <div className="App">
      <ul>
          {

            user && user.results.map(usr => <User user={usr}></User>)
          }
      </ul>
     
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

我正在使用 useEffect 调用 API。在此之前,我使用 useState 命名用户设置了一个 const,其默认值为空数组。在 useEffect 中,我使用 setUSer() 设置用户值。但是当我映射用户时,它给出了一条消息 TypeError: Cannot read property 'map' of undefined 的平均错误;

【问题讨论】:

    标签: javascript css reactjs ajax


    【解决方案1】:

    您似乎不太可能同时需要 setUser(data.results)user.results.map - 就像 data.results.results.map。我想你想要user.map,然后你也可以去掉user &amp;&amp;检查,因为.map仍然可以在空数组上工作。

    【讨论】:

    • 错误:对象作为 React 子项无效(发现:对象带有键 {title, first, last})。如果您打算渲染一组子项,请改用数组。这样做后显示这个..
    • 这可能来自User 组件吗?
    【解决方案2】:

    对结果进行条件渲染。发生这种情况是因为 api 获取需要时间,在此之前你的 user 变量是未定义的。

    【讨论】:

    • 我将如何进行条件渲染?
    • {user.length == 0 ? null : user.results.map(usr =&gt; &lt;User user={usr}&gt;&lt;/User&gt;)}
    【解决方案3】:

    如您所见,您使用 Array Name 获取 api:结果。 这是链接:- https://randomuser.me/api/?results=10 所以你将用户设置为 data.results 。 然后访问 user.results.map ,这是错误的,因为你在 user 中没有结果,用户值等于 results.values

    解决方案:- 1- 从 user.results.map 更改为 -> user.map 这里会怎样:-

    import logo from './logo.svg';
    import './App.css';
    import { useEffect, useState } from 'react';
    import User from './components/User/User';
    
    function App() {
      const [user, setUser] = useState([]);
      useEffect(() => {
        // Create an scoped async function in the hook
        async function loadData() {
          const response = await fetch("https://randomuser.me/api/?results=10");
          const data = await response.json();
          setUser(data.results);
        }
    
        loadData()
      }, [])
    
      console.log(user)
    
      return (
        
    
        
        <div className="App">
          <ul>
              {
    
                user && user.map(usr => <User user={usr}></User>)
              }
          </ul>
         
     
    

    【讨论】:

      【解决方案4】:

      如果您将空数组检查为“用户 &&”,它仍然会返回 true。

      尝试从 lodash/下划线检查 user.length &gt; 0isEmpty(user)

      user.length > 0 && user.results && user.results.map(usr => <User user={usr}></User>)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 2021-08-26
        • 2020-01-21
        • 2021-06-25
        • 2020-06-16
        • 2019-01-12
        • 2017-04-24
        相关资源
        最近更新 更多