C3 图表未在 React 项目中呈现

C3 chart not rendering in react project

我想在 React 中使用 c3 创建一个字符,稍后每秒更新一次。

我正在尝试按照提供的示例进行操作 ,但创建图表的第一步并未发生。

这是我的 fiddle:

https://jsfiddle.net/69z2wepo/227446/

import c3 from 'c3';
import React from "react";
import ReactDOM from "react-dom";

class Hello extends React.Component {

  renderChart() {
        this.chart = c3.generate({
            bindto:"#chart1",
            data: {
                columns: [
                    ['data1', 30, 200, 100, 400, 150, 250],
                    ['data2', 50, 20, 10, 40, 15, 25]
                ]
            }
        });
    }



  render() {

    this.renderChart()

    return <div id="chart1"></div>;
  }
}

ReactDOM.render(
  <Hello />,
  document.getElementById('container')
);

我用 npm 安装了 c3 并将其导入到组件中。

感谢您的帮助。

在您的示例中,看起来图表是在选择器 div 呈现之前生成的,因此图表无处可去。在 render() 中调用 this.renderChart(),您可以调用它 componentDidMount。在这种情况下,渲染将在初始加载时调用,您的 <div id="chart1"></div> 将被渲染,然后 renderChart 将 运行,将 SVG 添加到 div.

至于更新数据,您可以将列数据本身移动到状态,然后用一些新数据调用 setState 并使用 componentDidUpdate 重新呈现图表。这可能看起来像这样:

class Chart extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      column1: ['data1', 30, 200, 100, 400, 150, 250],
      column2: ['data2', 50, 20, 10, 40, 15, 25],
    };

    this.changeData = this.changeData.bind(this);
  }

  renderChart() {
    c3.generate({
      bindto: "#chart1",
      data: {
        columns: [this.state.column1, this.state.column2],
      },
    });
  }

  componentDidMount() {
    this.renderChart();
  }

  componentDidUpdate() {
    this.renderChart();
  }

  // Changes data to something arbitrary on button click
  changeData() {
    this.setState({
      column1: ['data1', 70, 120, 30, 300, 230, 300],
      column2: ['data2', 100, 120, 50, 140, 150, 80],
    });
  }

  render() {
    return (
      <div>
        <div id="chart1"></div>
        <button onClick={this.changeData}>Change</button>
      </div>
    );
  }
}

React 生命周期方法是这里的关键。这是从文档链接的方便图表:http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/