如何在reactJS

时间:2019-07-02 21:26:23

标签: javascript reactjs highcharts

在过去的几天里,我一直在努力在我的React项目中使用这种图表类型 https://jsfiddle.net/26tbkjov//

有人可以帮帮我吗? 请检查我到目前为止所取得的成就: https://codesandbox.io/s/highcharts-react-demo-0m5ux

我正在使用那些高图表的npm软件包

  

“ highcharts”:“ ^ 7.1.2”,   “ highcharts-react-official”:“ ^ 2.2.2”,

我尝试了很多事情,最终陷入了死路..以下是我尝试过的最后一件事:

import React from "react";
import mapData from '../../api/mapData';
import Highcharts from 'highcharts';
import HighchartsReact from 'highcharts-react-official';

require('highcharts/modules/map')(Highcharts);

class MyMap extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      mapValues: [],
      modalClassic: false,
    };
    this.mapData = new mapData();
    // preparing the config of map with empty data 
    this.options = {
      title: {
        text: 'Widget click by location',
          style: {
          color: '#fff'
        },
      },
      chart:{
        backgroundColor: 'transparent',
        type: 'map',
        map: null,
      },
      mapNavigation: {
        enabled: true,
          enableButtons: false
      },
      credits: {
        enabled: false
      },
      colorAxis: {
        dataClasses: [
          {
            from: 1,
            color: '#C40401',
            name: 'widget name one'
          }, {
            from: 2,
            color: '#0200D0',
            name: 'widget name two'
          }
        ]
      },
      tooltip: {
        pointFormatter: function() {
          return this.name;
        }
      },
      legend: {
        align: 'right',
          verticalAlign: 'top',
          x: -100,
          y: 70,
          floating: true,
          layout: 'vertical',
          valueDecimals: 0,
          backgroundColor: ( // theme
          Highcharts.defaultOptions &&
          Highcharts.defaultOptions.legend &&
          Highcharts.defaultOptions.legend.backgroundColor
        ) || 'rgba(255, 255, 255, 0.85)'
      },
      series: [{
        name: 'world map',
        dataLabels: {
          enabled: true,
          color: '#FFFFFF',
          format: '{point.postal-code}',
          style: {
            textTransform: 'uppercase'
          }
        },
        tooltip: {
          ySuffix: ' %'
        },
        cursor: 'pointer',
        joinBy: 'postal-code',
        data: [],
        point: {
          events: {
            click: function(r){
              console.log('click - to open popup as 2nd step');
              console.log(r);
            }
          }
        }
      }]
    };
  }

  /*
  * Before mounting the component,
  * update the highchart map options with the needed map data and series data
  * */
  componentWillMount = () => {
    this.mapData.getWorld().then((r)=>{
      this.setState({'mapData': r.data}, ()=>{

        this.options.series[0].data = []; //make sure data is empty before  fill
        this.options['chart']['map'] = this.state.mapData; // set the map data of the graph (using the world graph)

        // filling up some dummy data with values 1 and 2
        for(let i in this.state.mapData['features']){
          let mapInfo = this.state.mapData['features'][i];
            if (mapInfo['id']) {
              var postalCode = mapInfo['id'];
              var name = mapInfo['properties']['name'];
              var value = i%2 + 1;
              var type = (value === 1)? "widget name one" : "widget name two";
              var row = i;
              this.options.series[0].data.push({
                value: value,
                name: name,
                'postal-code': postalCode,
                row: row
              });
            }
          }
          // updating the map options
          this.setState({mapOptions: this.options});
      });
    });
  }

  render() {
    return (
      <div>
            {(this.state.mapData)?
              <HighchartsReact
                highcharts={Highcharts}
                constructorType={'mapChart'}
                options={(this.state.mapOptions)? this.state.mapOptions: this.options}
              />
              : ''}
      </div>
    );
  }
}

export default MyMap;

1 个答案:

答案 0 :(得分:3)

如果要使用美国地图,则需要将网址更改为:"https://code.highcharts.com/mapdata/countries/us/us-all.geo.json",并将邮政编码从US.MA更改为MA

this.mapData.getWorld().then(r => {
  ...
    for (let i in this.state.mapData["features"]) {
      ...
        var postalCode = mapInfo.properties["postal-code"];

        ...
    }
    ...
});

实时演示: https://codesandbox.io/s/highcharts-react-demo-jmu5h

要使用单词图,还需要更改与邮政编码和joinBy属性相关的部分:

series: [{
    joinBy: ['iso-a2', 'code'],
    ...
}]

this.mapData.getWorld().then(r => {
    ...
    for (let i in this.state.mapData["features"]) {
      let mapInfo = this.state.mapData["features"][i];
      if (mapInfo["id"]) {
        var code = mapInfo["id"];

        ...
        this.options.series[0].data.push({
          "code": code,
          ...
        });
      }
    }
    ...
});

实时演示: https://codesandbox.io/s/highcharts-react-demo-sxfr2

API参考: https://api.highcharts.com/highmaps/series.map.joinBy