开发者问题收集

收到 TypeError:无法读取 React 中未定义的属性“map”

2020-09-07
72

我已向 News API 发出 GET 请求并接收了对象形式的数据。由于 map 方法只能在数组上工作,因此我将 map 用于 data.articles ,因为它是一个数组。(在第 22 行的控制台日志中检查)。

话虽如此,我不明白为什么我仍然收到

TypeError Cannot read property 'map' of undefined

https://codesandbox.io/s/elated-star-j9s8g?file=/src/App.js

function App() {
  const [apiUrl] = useState("https://gnews.io/api/v3/search?");
  const [apiKey] = useState("123456789");
  const [data, setData] = useState([]);
  const [query, setQuery] = useState("");
  const [url, setUrl] = useState(
    `https://gnews.io/api/v3/top-news?token=95e7679f627d5796aa24f6692def5df3`
  );

  useEffect(() => {
    const fetchData = async () => {
      const result = await axios(url);
      setData(result.data);
    };
    fetchData();
  }, [url]);

  const searchHandler = () => {
    setUrl(`${apiUrl}q=${query}&token=${apiKey}`);
    console.log(data.articles);
  };

  let newsNodes = data.articles.map((item) => {
    return (
      <li key={item.publishedAt}>
        <a href={item.url}>{item.title}</a>
      </li>
    );
  });

  return (
    <>
      <input
        type="text"
        value={query}
        onChange={(event) => setQuery(event.target.value)}
      />
      <button type="button" onClick={searchHandler}>
        Search
      </button>
      <ul>{newsNodes}</ul>
    </>
  );
}
2个回答

正如其他人所说,当组件最初呈现时, data.articles 未定义。如果您在 map 之前记录数据,这一点很明显。>

在此处输入图像描述

您可能有一个条件来检查它是否未定义,只有这样您才会继续使用 map

let newsNodes = data.articles && data.articles.map((item) => {
  return (
    <li key={item.publishedAt}>
      <a href={item.url}>{item.title}</a>
    </li>
  );
});
95faf8e76605e973
2020-09-07

在传递给 useState 的初始值中,你将 data 初始化为 [] ,而 [].articlesundefined

Lionel Rowe
2020-09-07