【问题标题】:Fetched data from external api,how to loop through the array and display values从外部 api 获取数据,如何遍历数组并显示值
【发布时间】:2020-01-31 13:21:05
【问题描述】:

“我使用 react redux 调用了 externalapi,并且 store 加载了来自 API 的数据。但是当我尝试使用 map 函数时,会显示“无法读取未定义的属性 'map'”错误

     {this.props.carDetails.array.map(([key,value])=>[key,value])}

carDetails is loaded with following dat

    open_cars: Array(2)
    0: {carid: 1, title: “bmw”} 1: {carid:2,title:”audi”}"


Here is my class
import React, { Component } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { fetchVehicleDetails } from '../actions'
import Post from '../components/Post/Post.js'
class FetchRandomUser extends Component {
  componentDidMount() {
    this.props.fetchVehicleDetails()
  }
  render() {
    return (
      <div>
        {this.props.carDetails.array.map(([key, value]) => [key, value])}
      </div>
    )
  }
}
FetchRandomUser.propTypes = {
  // carDetails:PropTypes.object,
  fetchVehicleDetails: PropTypes.func
}
function mapStateToProps(state) {
  return {
    carDetails: state.carDetails
  }
}
function loadData(store) {
  return store.dispatch(fetchVehicleDetails())
}
export default {
  loadData,
  component: connect(mapStateToProps, { fetchVehicleDetails })((FetchRandomUser))
}

【问题讨论】:

  • 请向我们展示您的代码。
  • 您应该登录 props:console.log(JSON.stringify(this.props,udefined,2)) 我想您可能正在尝试在响应数据设置之前访问它。
  • 我可以看到数据进入 carDetails,但我无法循环并显示值。 CarDetails 有以下数据 open_cars: Array(2) 0: {carid: 1, title: “bmw”} 1: {carid:2,title:”audi”}"

标签: reactjs redux mapping store


【解决方案1】:

我可以从这里猜到你没有映射到数组 将您的地图更改为

{this.props.carDetails.open_cars.map((value)=>value)}

考虑到你在 open_cars 中有一个数组。 如果这是一个对象,您可以使用 Object.keys(yourObject).map() 来循环对象中的属性。

【讨论】:

  • 我试过了,但由于 open_cars 未定义而出现错误
  • 为什么要映射到 this.props.carDetails.array 上?你能显示 this.props.carDetails 记录什么吗?
【解决方案2】:

您正在阅读“this.props.carDetails.array”,在响应中您有“ open_cars:数组(2)”。 但是您正在访问“this.props.carDetails.array.map”,其中“array”不在实际响应中。

所以试试这样吧。

    <div>
        {this.props.carDetails && this.props.carDetails.open_cars ?
this.props.carDetails.open_cars.map(([key, value]) => [key, value])
:'' }
      </div>

【讨论】:

    【解决方案3】:

    因为当您从 API 服务器获取数据时,这是一个异步。当您的组件第一次渲染时,carDetails尚未更新。在组件的下一次渲染中(第二次),carDetails将会更新。

    所以,在你的组件中,像这样检查:

    class FetchRandomUser extends Component {
      componentDidMount() {
        this.props.fetchVehicleDetails()
      }
      render() {
        const { carDetails } = this.props;
        return (
          <div>
            {
               // The data: `open_cars: Array(2) 0: {carid: 1, title: “bmw”} 1: {carid:2,title:”audi”}"`
               // So you must access to `open_cars` not `array` here
               carDetails && carDetails.open_cars && carDetails.open_cars.length && 
               carDetails.open_cars.map(([key,value])=>[key,value])
            }
          </div>
        )
      }
    }
    

    【讨论】:

    • 试过这种方式,但没有抛出同样的错误:(
    • 错误 Cannot read property 'map' of undefined 的意思是 attr array 未定义。你确定你有 attr .array 作为 carDetails 中的数组吗?
    • 我编辑了我的帖子。请再试一次 !您应该访问您的密钥是open_cars,而不是array as type Array
    • 当我使用以下代码时,我能够查看数据..非常感谢:)。 { car​​Details && carDetails.open_cars && carDetails.open_cars.map((item,i)=>
    • {item.title}
    • ) }
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签