| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- import React, { Component } from 'react';
- import { Chart, Axis, Tooltip, Geom } from 'bizcharts';
- import Debounce from 'lodash-decorators/debounce';
- import Bind from 'lodash-decorators/bind';
- import autoHeight from '../autoHeight';
- import styles from '../index.less';
- @autoHeight()
- class Bar extends Component {
- state = {
- autoHideXLabels: false,
- };
- componentDidMount() {
- window.addEventListener('resize', this.resize);
- }
- componentWillUnmount() {
- window.removeEventListener('resize', this.resize);
- }
- @Bind()
- @Debounce(400)
- resize() {
- if (!this.node) {
- return;
- }
- requestAnimationFrame(() => {
- const canvasWidth = this.node.parentNode.clientWidth;
- const { data = [], autoLabel = true } = this.props;
- if (!autoLabel) {
- return;
- }
- const minWidth = data.length * 30;
- const { autoHideXLabels } = this.state;
- if (canvasWidth <= minWidth) {
- if (!autoHideXLabels) {
- this.setState({
- autoHideXLabels: true,
- });
- }
- } else if (autoHideXLabels) {
- this.setState({
- autoHideXLabels: false,
- });
- }
- });
- }
- handleRoot = n => {
- this.root = n;
- };
- handleRef = n => {
- this.node = n;
- };
- render() {
- const {
- height,
- title,
- forceFit = true,
- data,
- color = 'rgba(24, 144, 255, 0.85)',
- padding,
- } = this.props;
- const { autoHideXLabels } = this.state;
- const scale = {
- x: {
- type: 'cat',
- },
- y: {
- min: 0,
- },
- };
- const tooltip = [
- 'x*y',
- (x, y) => ({
- name: x,
- value: y,
- }),
- ];
- return (
- <div className={styles.chart} style={{ height }} ref={this.handleRoot}>
- <div ref={this.handleRef}>
- {title && <h4 style={{ marginBottom: 20 }}>{title}</h4>}
- <Chart
- scale={scale}
- height={title ? height - 41 : height}
- forceFit={forceFit}
- data={data}
- padding={padding || 'auto'}
- >
- <Axis
- name="x"
- title={false}
- label={autoHideXLabels ? false : {}}
- tickLine={autoHideXLabels ? false : {}}
- />
- <Axis name="y" min={0} />
- <Tooltip showTitle={false} crosshairs={false} />
- <Geom type="interval" position="x*y" color={color} tooltip={tooltip} />
- </Chart>
- </div>
- </div>
- );
- }
- }
- export default Bar;
|