【问题标题】:FourSquare Axios Request - ReactJs - Cannot read property 'map' of undefinedFourSquare Axios 请求 - ReactJs - 无法读取未定义的属性“地图”
【发布时间】:2018-11-14 04:00:06
【问题描述】:

请帮忙:)

我正在做简单的 Axios 获取请求,在“组件安装”中。在一个简单/基本的反应应用程序中。我正在尝试获取伦敦的 FourSquare 地点数据。

我的功能有效,因为我可以 console.log 数据。这是我的组件安装代码:

// FOURSQUARE COMPONENT DID MOUNT
componentDidMount() {
  console.log('COMPONENT DID MOUNT');
  axios.get('https://api.foursquare.com/v2/venues/explore…')

  .then(res => {
   console.log('data', res.data.response.groups[0].items);
// console.log('data',res.data.response.groups[0].items[0].venue.name);
   this.setState(
   { places: res.data.response.groups[0].items}
  );
 });
}

请在此处附上console.log 的截图。 https://i.imgur.com/DPPxwdW.png

但是,我正在尝试映射数据,以在对象数组/res.data 中获取“venue.name”。但我不断收到以下错误:

无法读取未定义的属性“地图”

这是我试图通过数据映射的方式......

const Loaders = ({places}) => {

  return (

    <section>
      <div className="columns is-multiline">
        {places.map((place, i) => <div className="column is-one-quarter" key={i}>
          <ul>
            <li>
              <div className="card-image">
                <figure className="image">
                 <h2 className="has-text-centered has-text-grey">title: {place.venue.name}</h2>
                </figure>
              </div>
            </li>
          </ul>
        </div>)}
      </div>
    </section>
  );
};

export default Loaders;

【问题讨论】:

  • 您的“places”变量无效(不是数组)...您能否检查该变量是否获得了正确的数据?例如:将 places.length 转储到视图中..

标签: javascript reactjs api axios


【解决方案1】:

发生这种情况的原因是因为请求是异步的,并且在获得响应之后设置了场所状态。所以最初,places 是未定义的。 可以在加载状态下渲染加载指示器

常量加载器 = ({places}) => { 如果(!地方){ 返回加载中... }

返回(

<section>
  <div className="columns is-multiline">
    {places.map((place, i) => <div className="column is-one-quarter" key={i}>
      <ul>
        <li>
          <div className="card-image">
            <figure className="image">
             <h2 className="has-text-centered has-text-grey">title: {place.venue.name}</h2>
            </figure>
          </div>
        </li>
      </ul>
    </div>)}
  </div>
</section>

); };

或在构造函数中将位置初始化为空数组

constructor(props) {
   this.state = {
     places = []
   }
}

【讨论】:

  • 等我得到:{place.venue.categories[0].name}
  • 响应嵌套很深。您将需要对其进行处理以满足您的 UI 需求。你知道它是总是一个类别还是可以有更多类别?你打算在你的 UI 中展示它吗?
【解决方案2】:

问题是this.state.places 在某些时候是未定义的。问题可能是初始状态在开始时未设置为空数组,或者逻辑中的某些内容更改了places 的值。尝试

class Foo extends React.Component {
    state = {
        places: []
    }

    render() {
        return <Loaders places={this.state.places} />>
    }
}

【讨论】:

  • 您可以使用join 函数通过“胶水”获取所有值。类似place.venue.formattedAddress.join(', ')
  • 对不起,但在这个例子中,我将如何通过这个数据中的一个数组。例如,我想访问您可以在此链接中看到的 categories.name,但我没有得到任何返回。可能是因为我需要再次在我的 JSX 中循环遍历它。i.imgur.com/kzKaiJ6.png
  • 是的,categories 是一个数组,因此如果类别中有多个元素,您仍然可以使用 joinplace.venue.categories.map(_ =&gt; _.name).join(', ')
猜你喜欢
  • 2021-12-10
  • 2021-02-18
  • 2017-04-23
  • 2017-07-30
  • 2020-09-14
  • 2020-07-07
  • 2017-08-15
  • 2021-11-17
  • 2018-02-08
相关资源
最近更新 更多