index.js 1.89 KB
Newer Older
1 2
import React, { PureComponent } from 'react';
import G2 from 'g2';
nikogu's avatar
nikogu committed
3
import equal from '../equal';
4 5 6 7 8 9 10 11
import styles from '../index.less';

class MiniArea extends PureComponent {
  componentDidMount() {
    this.renderChart(this.props.data);
  }

  componentWillReceiveProps(nextProps) {
nikogu's avatar
nikogu committed
12
    if (!equal(this.props, nextProps)) {
13 14 15 16
      this.renderChart(nextProps.data);
    }
  }

nikogu's avatar
nikogu committed
17 18 19 20 21 22
  componentWillUnmount() {
    if (this.chart) {
      this.chart.destroy();
    }
  }

23 24 25 26 27
  handleRef = (n) => {
    this.node = n;
  }

  renderChart(data) {
nikogu's avatar
nikogu committed
28
    const { height = 0, fit = true, color = '#33abfb', line, xAxis, yAxis, animate = true } = this.props;
29 30 31 32 33 34 35 36 37 38 39 40

    if (!data || (data && data.length < 1)) {
      return;
    }

    // clean
    this.node.innerHTML = '';

    const chart = new G2.Chart({
      container: this.node,
      forceFit: fit,
      height: height + 54,
nikogu's avatar
nikogu committed
41
      animate,
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
      plotCfg: {
        margin: [36, 0, 30, 0],
      },
      legend: null,
    });

    if (!xAxis && !yAxis) {
      chart.axis(false);
    }

    if (xAxis) {
      chart.axis('x', xAxis);
    } else {
      chart.axis('x', false);
    }

    if (yAxis) {
      chart.axis('y', yAxis);
    } else {
      chart.axis('y', false);
    }

    chart.source(data, {
      x: {
        type: 'cat',
        range: [0, 1],
        ...xAxis,
      },
      y: {
        min: 0,
        ...yAxis,
      },
    });

    chart.tooltip({
      title: null,
      crosshairs: false,
      map: {
        name: 'x',
      },
    });
    chart.area().position('x*y').color(color).shape('smooth');
    if (line) {
      chart.line().position('x*y').color(color).shape('smooth');
    }
    chart.render();
nikogu's avatar
nikogu committed
88 89

    this.chart = chart;
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
  }

  render() {
    const { height } = this.props;

    return (
      <div className={styles.miniChart} style={{ height }}>
        <div>
          <div ref={this.handleRef} />
        </div>
      </div>
    );
  }
}

export default MiniArea;