【问题标题】:How to Update chart in react-chartjs-2?如何更新 react-chartjs-2 中的图表?
【发布时间】:2018-02-13 15:33:39
【问题描述】:

我调用了update() 函数,但它不起作用。

TypeError: line.update 不是函数。

为什么update() 不是函数?

我在http://jsfiddle.net/zpnx8ppb/26/ 上看到过这个例子,更新功能确实有效

这是我的代码:

import React, { Component } from 'react';
import { Line } from 'react-chartjs-2';
import Chart from 'chart.js';

const line = {
    labels: [],
    datasets: [
       {
          label: 'My First dataset',
          fill: false,
          data: []
       }
    ]
};

setInterval(function(){
    line.labels.push(Math.floor(Math.random() * 100));
    line.datasets[0].data.push(Math.floor(Math.random() * 100));
    line.update();
}, 5000);

class LineChart extends Component {
    render() {
        return (
            <div className="chart">
                <Line
                    data={this.state}
                    height={5}
                    width={20}
                />
            </div>          
        )
    }
}

export default LineChart;

【问题讨论】:

  • 您尝试更新的行是一个对象。设置Line 组件的引用并尝试更新该引用。 (这只是一个猜测,因为我之前从未使用过 react-chartjs)
  • const line = { -> line.update() 您自己制作的 lin 对象中没有函数定义更新

标签: javascript reactjs react-chartjs


【解决方案1】:

所以根据https://www.npmjs.com/package/react-chartjs-2

可以使用 ref 访问图表参考,例如

chartReference = {};

componentDidMount() {
  console.log(this.chartReference); // returns a Chart.js instance reference
}

render() {
  return (<Doughnut ref={(reference) => this.chartReference = reference } data={data} />)
}

所以你可以做的是在你的 Chart 中放一个 ref 并在任何你喜欢的地方访问它。

<Line
     data={this.state}
     height={5}
     width={20}
     ref = {(reference) => this.reference = reference}
/>

在您希望进行更新的方法中,您可以访问此引用及其 chartInstance 并在此实例上调用更新函数。

let lineChart = this.reference.chartInstance
lineChart.update();

【讨论】:

  • 这仍然适用于 react-chartjs-2 吗?当 api 数据发生变化时,我试图让我的折线图销毁,我正在尝试这种方法,但获取 chartReference 是未定义的
  • 我不确定它是否适用于现在。我建议要么再次检查他们的文档,要么只是尝试查看 Javascript 对象并确定这是否仍然适用。
【解决方案2】:

你需要更新图表,line只是图表上的一个配置设置,这个更新需要流回handler

为了让你走上正确的道路,这是我的意思的一个例子

var config = {};

class Chart extends Component {
    constructor() {
        super();
        this.ctx = document.getElementById(this._rootNodeID).getContext("2d");
        this.chart = new Chart(ctx, config);

    }


    changeHandler(value) {
        this.chart.update();
    }

    render() {
        return (
            <canvas id={this._rootNodeID}>
                <LineChart value={this.state.value} 
                           config={this.config} 
                           onChange={this.changeHandler}/>
            </canvas>
        );
    }
}


const line = {
    labels: [],
    datasets: [
        {
            label: 'My First dataset',
            fill: false,
            data: []
        }
    ]
};



class LineChart extends Component {

    constructor(props) {
        super(props);

        this.props.config = line;
        setInterval(function(){
            this.props.config.labels.push(Math.floor(Math.random() * 100));
            this.props.config.datasets[0].data.push(Math.floor(Math.random() * 100));
            this.props.changeHandler();
        }, 5000);

    }


    render() {
        return (
            <div className="chart">
                <Line
                    data={this.state}
                    height={5}
                    width={20}
                />
            </div>
        )
    }
}

export default Chart;
export default LineChart;

【讨论】:

    【解决方案3】:

    我建议不要使用 setInterval,尝试将图表实例传递给调度程序等,并在请求完成时更新它

       ChartJS.data = response.data;
       ChartJS.update();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      相关资源
      最近更新 更多