【问题标题】:App.js:29 Uncaught TypeError: Cannot read property 'map' of undefinedApp.js:29 未捕获的类型错误:无法读取未定义的属性“地图”
【发布时间】:2020-08-09 18:55:30
【问题描述】:

我目前正在学习赫尔辛基大学的全栈公开课程,但遇到了一个我无法破解的错误。我正在构建一个从 Rest Country API (https://github.com/apilayer/restcountries) 获取数据的 React Web 应用程序。我正在尝试获取特定国家/地区(例如https://restcountries.eu/rest/v2/alpha/aus)并呈现名称、首都、人口、语言列表和标志。除了语言列表之外的所有内容都可以与此代码完美配合:

    import React, { useState, useEffect } from 'react'
    import axios from 'axios'

    const App = () => {
      const [ country, setCountry] = useState([])

   useEffect(() => {
        console.log('effect')
        axios
          .get('https://restcountries.eu/rest/v2/alpha/aus')
          .then(response => {
            console.log('promise fulfilled')
            setCountry(response.data)
          })
      }, [])
      console.log({country})

      return (
        <div>
            <h1>{country.name}</h1>
            <p>Capital: {country.capital}</p>
            <p>Population: {country.population}</p>
            <h2>Languages</h2>
            <h2>Flag</h2>
            <img
              src={country.flag}
              style={{width:200, height:128}}
            />
        </div>
      );
    }

    export default App;

但是,当我将以下内容添加到 ...,以尝试呈现语言列表时,我收到错误:“App.js:29 Uncaught TypeError: Cannot read property 'map' of undefined”

        <ul>
          {country.languages.map(language =>
            <li key={language.name}>{language.name}</li>
          )}
        </ul>

如果有人有任何提示,将不胜感激。

【问题讨论】:

  • 如果country.languages是由axios响应设置的,那么在浏览器收到响应之前,您将无法访问它。

标签: javascript reactjs


【解决方案1】:

你可以使用?。运算符以避免多次 && 检查。您的代码将是 country?.languages?.map

【讨论】:

  • 感谢 gautamits。这是一个不错的捷径。
  • 欢迎@LidderDj,很高兴为您提供帮助。如果解决方案解决了您的问题,请将问题标记为已解决。
【解决方案2】:

当 country 仍然等于 [] 时,它在第一次渲染时出错。因此,在第一次渲染时,它会尝试在 [].languages 上调用 te map 方法,该方法未定义且没有 map 方法。

您可以通过添加检查是否设置了 country.languages 来解决此问题,如下所示:

<ul>
  {country.languages && country.languages.map(language =>
    <li key={language.name}>{language.name}</li>
  )}
</ul>

map 方法现在只会在设置 country.languages 时被触发。

【讨论】:

  • 这行得通并且有意义。谢谢你的解释!
  • 没问题,如果您点击我的回答左上角的复选标记,您的问题将被列为“已解决”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2015-01-06
  • 2017-07-26
相关资源
最近更新 更多