import React, { PureComponent } from 'react'; import G2 from 'g2'; import Debounce from 'lodash-decorators/debounce'; import Bind from 'lodash-decorators/bind'; import equal from '../equal'; class Bar extends PureComponent { componentDidMount() { this.renderChart(this.props.data); window.addEventListener('resize', this.resize); } componentWillReceiveProps(nextProps) { if (!equal(this.props, nextProps)) { this.renderChart(nextProps.data); } } componentWillUnmount() { window.removeEventListener('resize', this.resize); if (this.chart) { this.chart.destroy(); } this.resize.cancel(); } @Bind() @Debounce(200) resize() { if (!this.node) { return; } this.renderChart([]); } handleRef = (n) => { this.node = n; }; renderChart(data) { if (this.node.offsetWidth === 0) { return; } const { xUnit = '', yUnit = '', height, style, } = this.props; const textMyStyle = {}; if (style !== undefined) { if (style.color !== undefined) { textMyStyle.fill = style.color; } } if (!data || (data && data.length < 1)) return; // clean if (this.chart) { this.chart.destroy(); } this.node.innerHTML = ''; const chart = new G2.Chart({ container: this.node, autoFit: true, /* 图标自适应 */ height, padding: 'auto', }); chart.axis('x', { label: { formatter: (val) => { return `${val}${xUnit}`; }, textStyle: textMyStyle, }, }); chart.axis('y', { label: { formatter: (val) => { return `${val}${yUnit}`; }, textStyle: textMyStyle, }, }); chart.data(data); chart.tooltip({ showTitle: false, }); chart.coord().transpose(); chart.interval().position('y*x').tooltip('y*x', (name, value) => { return { name: `${name}${xUnit}`, value: `${value}${yUnit}`, }; }); chart.render(); this.chart = chart; } render() { return (
); } } export default Bar;