开发者问题收集

无法读取属性对象 reactJS

2017-08-08
1714

我只需要提取数据

import React,{Component} from 'react';
import axios from 'axios';
import CoinsConvert from '../data/data'
import '../style/bootstrap.min.css';


class BoxInfo extends Component{

  constructor(){
    super();
    this.state={
      dataC:{}
    }

  }
  componentWillMount(){
        let code=CoinsConvert[this.props.match.params.coin_url];
        axios.get(`https://www.cryptocompare.com/api/data/coinsnapshotfullbyid/?id=${code}`)
        .then(da=>this.setState({dataC:da.data})).catch(()=>{console.error()})
  }
 render(){
   let dataC=this.state.dataC;
    return(
      <div className="container">
        <div className="panel panel-default text-center"  >
        <div className="panel-heading" >{ dataC.Data.General.H1Text}</div>
        <div className="panel-body "><img className="img-rounded"  width="500" height="500" src={""} /></div>
        </div>
      </div>
    );
   }
}

在此处输入图片描述

示例 json: cryptocompare

3个回答

简单来说,api 调用是异步的,因此 this.state.dataC 将为 { ,直到您获得 api 响应。

在首次渲染期间,当您尝试访问:

this.state.dataC.Data 时,它将为 undefined ,当您尝试访问任何 undefined 值时,它将引发错误:

Can't read property XYZ of undefined.

解决方案:

检查数据,一旦获取数据,然后渲染 ui。

像这样:

render(){

   let dataC=this.state.dataC;
   if(!Object.keys(dataC)) return null;

   return (
       ....
   )
}

您还可以检查每个值,如下所示:

{ dataC.Data && dataC.Data.General && dataC.Data.General.H1Text}

建议:

而不是在 componentWillMount ,将其写在 componentDidMount 里面。

Mayank Shukla
2017-08-08

问题很可能是由于您将 dataC 设置为异步数据获取的结果。因此 componentWillMount 将完成,然后将调用 render ,注意!- 此时数据可能仍未获取 - 因此在渲染时您的 dataC 未定义。

Amid
2017-08-08

首先,您应该仅在 componentDidMount 方法中获取异步数据 DOCS
我认为另一件事可能会导致问题,这行代码:

this.setState({dataC:da.data})

您实际上已经访问了 data 属性。 在您的渲染方法中,您应该这样做:

dataC.General.H1Text

而不是这样:

dataC.Data.General.H1Text
Sagiv b.g
2017-08-08