使用React更新道具上的C3图表

时间:2015-05-03 19:37:09

标签: reactjs c3

我正在尝试美化在数据更改时写为React组件的C3图表的更新。数据通过其props从父组件流向组件。

我现在的解决方案"工作"但似乎不是最佳的:当新数据进入时,整个图表会重新生成。我想转换到新状态(行移动而不是整个图表更新闪烁)。 C3 API似乎有很多方法,但我找不到如何到达图表。

var React = require("react");
var c3 = require("c3");

var ChartDailyRev = React.createClass({
    _renderChart: function (data) {
        var chart = c3.generate({
            bindto: '#chart1',
            data: {
              json: data,
              keys: {
                  x: 'date',
                  value: ['requests', 'revenue']
              },
              type: 'spline',
              types: { 'revenue': 'bar' },
              axes: {
                'requests': 'y',
                'revenue': 'y2'
              }
            },
            axis: {
                x: { type: 'timeseries' },
                y2: { show: true }
            }
        });
    },
    componentDidMount: function () {
        this._renderChart(this.props.data);
    },
    render: function () {
        this._renderChart(this.props.data);
        return (
            <div className="row" id="chart1"></div>
        )
    }
});

module.exports = ChartDailyRev;

1 个答案:

答案 0 :(得分:11)

根据the project's documentation

  

通过使用API​​,您可以在呈现图表后更新图表。 ...可以通过generate()返回的对象调用API。

因此,您需要做的第一件事是在生成图表时保存对图表的引用。它很容易将它直接附加到组件上:

var ChartDailyRev = React.createClass({
    _renderChart: function (data) {
        // save reference to our chart to the instance
        this.chart = c3.generate({
            bindto: '#chart1',
            // ...
        });
    },

    componentDidMount: function () {
        this._renderChart(this.props.data);
    },

    // ...
});

然后,你想在道具更新时更新图表; React提供了一个名为componentWillReceiveProps的生命周期钩子,它在道具发生变化时运行。

var ChartDailyRev = React.createClass({
    // ...

    componentWillReceiveProps: function (newProps) {
        this.chart.load({
            json: newProps.data
        }); // or whatever API you need
    }
});

(务必从this._renderChart功能中删除render