动态更新React中的Highcharts图表

时间:2018-12-14 04:23:59

标签: javascript reactjs highcharts react-redux react-highcharts

我正在react-redux中使用highcharts-react-official来创建明细表。

但是,当我单击栏上的向下钻取时,我也会更新一些道具,这些道具会导致组件重新渲染-似乎阻止了向下钻取事件。

我从Change series data dynamically in react-highcharts without re-render of the chart那里收集到一种信息,我应该使用shouldComponentUpdate和getChart()来防止重新渲染,而是动态地更新数据。

我的问题是getChart()对于正式的highcharts react包似乎不起作用。我收到了Uncaught TypeError:this.refs.chart.getChart不是函数

我是否打算使用另一种方法来获取和动态更新图表?还是我可以看的一些例子?

此处仅包括render和shouldComponentUpdate部分:

shouldComponentUpdate(nextProps, nextState) {
    let chart = this.refs.chart.getChart();
    //dynamically update data using nextProps
    return false;
}

render () {

    const options = {
        chart: {
            type: 'column',
            height: 300,
            events: {
                drillup: (e) => {this.drilledUp(e)}
            }
        },
        plotOptions: {
            series: {
                events:{
                      click: (e) => {this.categoryClicked(e)}
                }
            }
        },
        xAxis: {type: "category"},
        yAxis: {title: {text: 'Amount Spent ($)'}},
        series: [{
            name: 'weekly spending',
            showInLegend: false,
            data: this.props.transactionChartData.series_data,
            cursor: 'pointer',
            events: {
                click: (e)=> {this.weekSelected(e)}
            }
        }],
        drilldown: {
            series: this.props.transactionChartData.drilldown_data

        }
    };
    return (
        <HighchartsReact
        highcharts={Highcharts}
        options={options}
        ref="chart"
        />
    )
}

2 个答案:

答案 0 :(得分:2)

highcharts-react-official v2.0.0中添加了allowChartUpdate选项,该选项在您的情况下效果很好。通过使用此选项,您可以通过更新组件来阻止更新图表:

categoryClicked() {
  this.allowChartUpdate = false;
  this.setState({
    ...
  });
}

...

  <HighchartsReact
    ref={"chartComponent"}
    allowChartUpdate={this.allowChartUpdate}
    highcharts={Highcharts}
    options={...}
  />

此外,要获取图表实例,请使用refs

componentDidMount(){
  const chart = this.refs.chartComponent.chart;
}

实时演示:https://codesandbox.io/s/98nl4pp5r4

答案 1 :(得分:0)

// react native functional

import React, {useState,  useRef,useLayoutEffect} from "react"
import HighchartsReactNative from '@highcharts/highcharts-react-native'

function chartcomponent(props){
   const [options, setoptions] = useState({});
   const chartRef = useRef(null);
  

  useEffect(() => {
     // create the options for your chart.
     setoptions({chart:{}, yaxis:{}, xAxis:{},})// etc.

  }, []);

  useLayoutEffect(() => {
       
        // new point to add, you can get new data via props, fetch, socket, etc.
        var x = new Date(hr.timestamp).getTime();
        var y = 10 

        // these are the important parts here:    
        var series = chartRef.current.props.options.series;
        if (!Array.isArray(series)){return;}
        var seriesdata = series[0].data;
        seriesdata.push([x,y]);
        // next line limits points in chart to 10, so new poitn replaces first point
        if (seriesdata.length>10){seriesdata.splice(0,1);}

        return () => {};
    }, [props]);


   return(
       <View style={styles.charting}><HighchartsReactNative styles={{height:300, width:600}}  options={options} ref={chartRef} ></HighchartsReactNative></View>


   )
}