Commit 8d9b7cfd authored by nikogu's avatar nikogu

update Pie responsive depend on root node width

parent bdffd006
...@@ -3,6 +3,7 @@ import G2 from 'g2'; ...@@ -3,6 +3,7 @@ import G2 from 'g2';
import { Divider } from 'antd'; import { Divider } from 'antd';
import classNames from 'classnames'; import classNames from 'classnames';
import ReactFitText from 'react-fittext'; import ReactFitText from 'react-fittext';
import Debounce from 'lodash-decorators/debounce';
import equal from '../equal'; import equal from '../equal';
import styles from './index.less'; import styles from './index.less';
...@@ -10,10 +11,13 @@ import styles from './index.less'; ...@@ -10,10 +11,13 @@ import styles from './index.less';
class Pie extends Component { class Pie extends Component {
state = { state = {
legendData: [], legendData: [],
legendBlock: true,
}; };
componentDidMount() { componentDidMount() {
this.renderChart(this.props.data); this.renderChart();
this.resize();
window.addEventListener('resize', this.resize);
} }
componentWillReceiveProps(nextProps) { componentWillReceiveProps(nextProps) {
...@@ -23,15 +27,42 @@ class Pie extends Component { ...@@ -23,15 +27,42 @@ class Pie extends Component {
} }
componentWillUnmount() { componentWillUnmount() {
window.removeEventListener('resize', this.resize);
if (this.chart) { if (this.chart) {
this.chart.destroy(); this.chart.destroy();
} }
} }
@Debounce(200)
resize = () => {
const { hasLegend } = this.props;
if (!hasLegend || !this.node) {
return;
}
// antd xs size
if (this.root.parentNode.clientWidth <= 480) {
if (!this.state.legendBlock) {
this.setState({
legendBlock: true,
});
this.renderChart();
}
} else if (this.state.legendBlock) {
this.setState({
legendBlock: false,
});
this.renderChart();
}
}
handleRef = (n) => { handleRef = (n) => {
this.node = n; this.node = n;
} }
handleRoot = (n) => {
this.root = n;
}
handleLegendClick = (item, i) => { handleLegendClick = (item, i) => {
const newItem = item; const newItem = item;
newItem.checked = !newItem.checked; newItem.checked = !newItem.checked;
...@@ -50,7 +81,9 @@ class Pie extends Component { ...@@ -50,7 +81,9 @@ class Pie extends Component {
}); });
} }
renderChart(data) { renderChart(d) {
let data = d || this.props.data;
const { const {
height = 0, height = 0,
hasLegend, hasLegend,
...@@ -167,13 +200,14 @@ class Pie extends Component { ...@@ -167,13 +200,14 @@ class Pie extends Component {
render() { render() {
const { valueFormat, subTitle, total, hasLegend, className, style } = this.props; const { valueFormat, subTitle, total, hasLegend, className, style } = this.props;
const { legendData } = this.state; const { legendData, legendBlock } = this.state;
const pieClassName = classNames(styles.pie, className, { const pieClassName = classNames(styles.pie, className, {
[styles.hasLegend]: !!hasLegend, [styles.hasLegend]: !!hasLegend,
[styles.legendBlock]: legendBlock,
}); });
return ( return (
<div className={pieClassName} style={style}> <div ref={this.handleRoot} className={pieClassName} style={style}>
<ReactFitText maxFontSize={25}> <ReactFitText maxFontSize={25}>
<div className={styles.chart}> <div className={styles.chart}>
<div ref={this.handleRef} style={{ fontSize: 0 }} /> <div ref={this.handleRef} style={{ fontSize: 0 }} />
......
...@@ -81,8 +81,7 @@ ...@@ -81,8 +81,7 @@
} }
} }
@media screen and (max-width: @screen-sm) { .legendBlock {
.pie {
&.hasLegend .chart { &.hasLegend .chart {
width: 100%; width: 100%;
margin: 0 0 32px 0; margin: 0 0 32px 0;
...@@ -91,5 +90,4 @@ ...@@ -91,5 +90,4 @@
position: static; position: static;
transform: none; transform: none;
} }
}
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment