|
|
@@ -12,7 +12,6 @@ import styles from './index.less';
|
|
|
/* eslint react/no-danger:0 */
|
|
|
class Pie extends Component {
|
|
|
state = {
|
|
|
- width: 0,
|
|
|
height: 0,
|
|
|
legendData: [],
|
|
|
legendBlock: false,
|
|
|
@@ -96,19 +95,18 @@ class Pie extends Component {
|
|
|
|
|
|
resizeObserver() {
|
|
|
const ro = new ResizeObserver(entries => {
|
|
|
- const { width, height } = entries[0].contentRect;
|
|
|
- this.setState((preState, { hasLegend }) => {
|
|
|
- if (preState.width !== width || preState.height !== height) {
|
|
|
+ const { height } = entries[0].contentRect;
|
|
|
+ this.setState(preState => {
|
|
|
+ if (preState.height !== height) {
|
|
|
return {
|
|
|
- width: width - (hasLegend ? 240 : 0),
|
|
|
height,
|
|
|
};
|
|
|
}
|
|
|
return null;
|
|
|
});
|
|
|
});
|
|
|
- if (this.root) {
|
|
|
- ro.observe(this.root);
|
|
|
+ if (this.chartDom) {
|
|
|
+ ro.observe(this.chartDom);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -152,7 +150,7 @@ class Pie extends Component {
|
|
|
lineWidth = 1,
|
|
|
} = this.props;
|
|
|
|
|
|
- const { legendData, height: StateHeight, width, legendBlock } = this.state;
|
|
|
+ const { legendData, height: stateHeight, legendBlock } = this.state;
|
|
|
const pieClassName = classNames(styles.pie, className, {
|
|
|
[styles.hasLegend]: !!hasLegend,
|
|
|
[styles.legendBlock]: legendBlock,
|
|
|
@@ -225,40 +223,45 @@ class Pie extends Component {
|
|
|
|
|
|
return (
|
|
|
<div ref={this.handleRoot} className={pieClassName} style={style}>
|
|
|
- <ReactFitText maxFontSize={25}>
|
|
|
- <div className={styles.chart}>
|
|
|
- <Chart
|
|
|
- scale={scale}
|
|
|
- height={height || StateHeight}
|
|
|
- data={dv}
|
|
|
- width={width}
|
|
|
- padding={padding}
|
|
|
- animate={animate}
|
|
|
- onGetG2Instance={this.getG2Instance}
|
|
|
- >
|
|
|
- {!!tooltip && <Tooltip showTitle={false} />}
|
|
|
- <Coord type="theta" innerRadius={inner} />
|
|
|
- <Geom
|
|
|
- style={{ lineWidth, stroke: '#fff' }}
|
|
|
- tooltip={tooltip && tooltipFormat}
|
|
|
- type="intervalStack"
|
|
|
- position="percent"
|
|
|
- color={['x', percent || percent === 0 ? formatColor : defaultColors]}
|
|
|
- selected={selected}
|
|
|
- />
|
|
|
- </Chart>
|
|
|
+ <div
|
|
|
+ ref={ref => {
|
|
|
+ this.chartDom = ref;
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <ReactFitText maxFontSize={25}>
|
|
|
+ <div className={styles.chart}>
|
|
|
+ <Chart
|
|
|
+ scale={scale}
|
|
|
+ height={height || stateHeight}
|
|
|
+ data={dv}
|
|
|
+ padding={padding}
|
|
|
+ animate={animate}
|
|
|
+ onGetG2Instance={this.getG2Instance}
|
|
|
+ >
|
|
|
+ {!!tooltip && <Tooltip showTitle={false} />}
|
|
|
+ <Coord type="theta" innerRadius={inner} />
|
|
|
+ <Geom
|
|
|
+ style={{ lineWidth, stroke: '#fff' }}
|
|
|
+ tooltip={tooltip && tooltipFormat}
|
|
|
+ type="intervalStack"
|
|
|
+ position="percent"
|
|
|
+ color={['x', percent || percent === 0 ? formatColor : defaultColors]}
|
|
|
+ selected={selected}
|
|
|
+ />
|
|
|
+ </Chart>
|
|
|
|
|
|
- {(subTitle || total) && (
|
|
|
- <div className={styles.total}>
|
|
|
- {subTitle && <h4 className="pie-sub-title">{subTitle}</h4>}
|
|
|
- {/* eslint-disable-next-line */}
|
|
|
- {total && (
|
|
|
- <div className="pie-stat">{typeof total === 'function' ? total() : total}</div>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- )}
|
|
|
- </div>
|
|
|
- </ReactFitText>
|
|
|
+ {(subTitle || total) && (
|
|
|
+ <div className={styles.total}>
|
|
|
+ {subTitle && <h4 className="pie-sub-title">{subTitle}</h4>}
|
|
|
+ {/* eslint-disable-next-line */}
|
|
|
+ {total && (
|
|
|
+ <div className="pie-stat">{typeof total === 'function' ? total() : total}</div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </ReactFitText>
|
|
|
+ </div>
|
|
|
{hasLegend && (
|
|
|
<ul className={styles.legend}>
|
|
|
{legendData.map((item, i) => (
|