简体   繁体   English

反应d3图形错误

[英]react d3 graph errors

d3_error I have two graphs, one I am making by calling an api and getting the data out of it and the other one by manipulating the data of it. 我有两个图,一个是通过调用api并从中获取数据而制成的,另一个是通过操纵它的数据而制成的。

import React, { Component } from 'react';
import * as d3 from 'd3';
import * as ReactD3 from 'react-d3-components';
import propTypes from 'prop-types';
var axios=require('axios');
var BarChart=ReactD3.BarChart;
var PieChart=ReactD3.PieChart;

class App extends Component {
  constructor(props){
    super(props);
    this.state={
      data:[],
      label:'Monthly Dates',
      label1: 'test',
      values:[],
      abc: [],
      x:'',
      y:''
    }
  }

  componentDidMount(){
   this.loadData();     
  }

  loadData(){   
      var me=this;
       axios({
          method:'GET',
          url:'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=SPY&apikey=2QEL3WC4KITIBISR',
        }).then(function(response){
          const values=[];
          if(response && response.data && response.data['Time Series (Daily)']){
            Object.keys(response.data['Time Series (Daily)']).forEach((keys)=>{
              if (keys) {
                const pointValue={
                  x:String(keys),
                  y:Number(response.data['Time Series (Daily)'][keys]['4. close'])
                }
                values.push(pointValue);
              }
            })
            me.setState({
              values: values
            });
          }
          me.getHistogramData(response);

        }).catch(function(error){
          console.log(error);
        })
    }

    getGraphData(){
      const {label,values} = this.state;
      return [{label,values}];
    }

    test() {
      if(this.state.abc.length){
        const {label1,abc} = this.state;
        return [{label1,abc}];
      }
      return null;
    }

    getHistogramData(response){
      var diff=0;
     if(response && response.data && response.data['Time Series (Daily)']){
        const diffValue=[];
        var keysArr = Object.keys(response.data['Time Series (Daily)']);
        var oldObj = 0;
        keysArr.map((eachObj) => {
          var newObj = response.data['Time Series (Daily)'][eachObj]['4. close'];
          var diff = newObj - oldObj;
          console.log("Difference: ", diff);
          oldObj = newObj;
          const values1={
            x:'abc',
            y: 1
          }
          diffValue.push(values1);
        })

        this.setState({
          abc: diffValue
        });
     } 
    }

  renderGraph(){
    if((this.state.values && this.state.values.length) || (this.state.abc && this.state.abc.length)){
      return(
        <div>
          <BarChart data={this.getGraphData()} width={17000} height={500} margin={{top:10,bottom:80,left:30,right:30}}/>
           <BarChart data={this.test()} width={17000} height={500} margin={{top:10,bottom:80,left:30,right:30}}/>
        </div>
        )
    }
  }

  render() {

    return (
      <div>
        {this.renderGraph()}
      </div>
    )
  }
}

App.propTypes={
    values:React.PropTypes.array,
    xScale:React.PropTypes.number,
    width:React.PropTypes.number
}

export default App;

While the first graph gets plotted by the function getGraphData(), the other one doesn't. 虽然第一个图形是通过函数getGraphData()绘制的,但另一个则没有。

When the code gets executed, I get the error 当代码被执行时,我得到了错误

TypeError: Cannot read property 'map' of undefined TypeError:无法读取未定义的属性“ map”

It's the same code for both the components but one of them doesn't work. 这两个组件的代码相同,但是其中一个不起作用。

What is wrong here? 怎么了

You need to manage states as per your graph as you said, it needs value and label fields in its BarChart component. 您需要按照您所说的图来管理状态,它的BarChart组件中需要valuelabel字段。 Something like below. 像下面这样。

state = {
  graph1: {
    label: 'Monthly Dates',
    values: [],
  },
  graph2: {
    label: 'Days',
    values: [],
  },
};

another way better, you can do just: 另一种更好的方法是,您可以执行以下操作:

test() {
  const { label1, abc } = this.state;
  return [{ label: label1, values: abc }];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM