Unverified Commit 29c23b1f authored by 陈帅's avatar 陈帅 Committed by GitHub

Add Loading (#4055)

* add loading in html

* add loading

* rm  console

* add ResizeObserver
parent 78c07fc9
version: "3.5" version: '3.5'
services: services:
ant-design-pro_build: ant-design-pro_build:
build: ../ build: ../
container_name: "ant-design-pro_build" container_name: 'ant-design-pro_build'
volumes: volumes:
- dist:/usr/src/app/dist - dist:/usr/src/app/dist
...@@ -11,7 +11,7 @@ services: ...@@ -11,7 +11,7 @@ services:
image: nginx image: nginx
ports: ports:
- 80:80 - 80:80
container_name: "ant-design-pro_web" container_name: 'ant-design-pro_web'
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- dist:/usr/share/nginx/html:ro - dist:/usr/share/nginx/html:ro
......
...@@ -2,12 +2,13 @@ import React, { Component } from 'react'; ...@@ -2,12 +2,13 @@ import React, { Component } from 'react';
import { Chart, Axis, Tooltip, Geom } from 'bizcharts'; import { Chart, Axis, Tooltip, Geom } from 'bizcharts';
import Debounce from 'lodash-decorators/debounce'; import Debounce from 'lodash-decorators/debounce';
import Bind from 'lodash-decorators/bind'; import Bind from 'lodash-decorators/bind';
import autoHeight from '../autoHeight'; import ResizeObserver from 'resize-observer-polyfill';
import styles from '../index.less'; import styles from '../index.less';
@autoHeight()
class Bar extends Component { class Bar extends Component {
state = { state = {
width: 0,
height: 0,
autoHideXLabels: false, autoHideXLabels: false,
}; };
...@@ -27,6 +28,24 @@ class Bar extends Component { ...@@ -27,6 +28,24 @@ class Bar extends Component {
this.node = n; this.node = n;
}; };
resizeObserver() {
const ro = new ResizeObserver(entries => {
const { width, height } = entries[0].contentRect;
this.setState((preState, { hasLegend }) => {
if (preState.width !== width || preState.height !== height) {
return {
width: width - (hasLegend ? 240 : 0),
height,
};
}
return null;
});
});
if (this.root) {
ro.observe(this.root);
}
}
@Bind() @Bind()
@Debounce(400) @Debounce(400)
resize() { resize() {
...@@ -56,7 +75,7 @@ class Bar extends Component { ...@@ -56,7 +75,7 @@ class Bar extends Component {
render() { render() {
const { const {
height, height: propsHeight,
title, title,
forceFit = true, forceFit = true,
data, data,
...@@ -82,13 +101,15 @@ class Bar extends Component { ...@@ -82,13 +101,15 @@ class Bar extends Component {
value: y, value: y,
}), }),
]; ];
const { height: stateHeight, width } = this.state;
const height = propsHeight || stateHeight;
return ( return (
<div className={styles.chart} style={{ height }} ref={this.handleRoot}> <div className={styles.chart} style={{ height }} ref={this.handleRoot}>
<div ref={this.handleRef}> <div ref={this.handleRef}>
{title && <h4 style={{ marginBottom: 20 }}>{title}</h4>} {title && <h4 style={{ marginBottom: 20 }}>{title}</h4>}
<Chart <Chart
scale={scale} scale={scale}
width={width}
height={title ? height - 41 : height} height={title ? height - 41 : height}
forceFit={forceFit} forceFit={forceFit}
data={data} data={data}
......
...@@ -6,14 +6,14 @@ import classNames from 'classnames'; ...@@ -6,14 +6,14 @@ import classNames from 'classnames';
import ReactFitText from 'react-fittext'; import ReactFitText from 'react-fittext';
import Debounce from 'lodash-decorators/debounce'; import Debounce from 'lodash-decorators/debounce';
import Bind from 'lodash-decorators/bind'; import Bind from 'lodash-decorators/bind';
import autoHeight from '../autoHeight'; import ResizeObserver from 'resize-observer-polyfill';
import styles from './index.less'; import styles from './index.less';
/* eslint react/no-danger:0 */ /* eslint react/no-danger:0 */
@autoHeight()
class Pie extends Component { class Pie extends Component {
state = { state = {
width: 0,
height: 0,
legendData: [], legendData: [],
legendBlock: false, legendBlock: false,
}; };
...@@ -26,6 +26,7 @@ class Pie extends Component { ...@@ -26,6 +26,7 @@ class Pie extends Component {
}, },
{ passive: true } { passive: true }
); );
this.resizeObserver();
} }
componentDidUpdate(preProps) { componentDidUpdate(preProps) {
...@@ -93,6 +94,24 @@ class Pie extends Component { ...@@ -93,6 +94,24 @@ 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) {
return {
width: width - (hasLegend ? 240 : 0),
height,
};
}
return null;
});
});
if (this.root) {
ro.observe(this.root);
}
}
// for window resize auto responsive legend // for window resize auto responsive legend
@Bind() @Bind()
@Debounce(300) @Debounce(300)
...@@ -125,7 +144,6 @@ class Pie extends Component { ...@@ -125,7 +144,6 @@ class Pie extends Component {
className, className,
style, style,
height, height,
forceFit = true,
percent, percent,
color, color,
inner = 0.75, inner = 0.75,
...@@ -134,7 +152,7 @@ class Pie extends Component { ...@@ -134,7 +152,7 @@ class Pie extends Component {
lineWidth = 1, lineWidth = 1,
} = this.props; } = this.props;
const { legendData, legendBlock } = this.state; const { legendData, height: StateHeight, width, legendBlock } = this.state;
const pieClassName = classNames(styles.pie, className, { const pieClassName = classNames(styles.pie, className, {
[styles.hasLegend]: !!hasLegend, [styles.hasLegend]: !!hasLegend,
[styles.legendBlock]: legendBlock, [styles.legendBlock]: legendBlock,
...@@ -211,9 +229,9 @@ class Pie extends Component { ...@@ -211,9 +229,9 @@ class Pie extends Component {
<div className={styles.chart}> <div className={styles.chart}>
<Chart <Chart
scale={scale} scale={scale}
height={height} height={height || StateHeight}
forceFit={forceFit}
data={dv} data={dv}
width={width}
padding={padding} padding={padding}
animate={animate} animate={animate}
onGetG2Instance={this.getG2Instance} onGetG2Instance={this.getG2Instance}
...@@ -241,7 +259,6 @@ class Pie extends Component { ...@@ -241,7 +259,6 @@ class Pie extends Component {
)} )}
</div> </div>
</ReactFitText> </ReactFitText>
{hasLegend && ( {hasLegend && (
<ul className={styles.legend}> <ul className={styles.legend}>
{legendData.map((item, i) => ( {legendData.map((item, i) => (
......
...@@ -18,6 +18,7 @@ const OfflineData = React.lazy(() => import('./OfflineData')); ...@@ -18,6 +18,7 @@ const OfflineData = React.lazy(() => import('./OfflineData'));
})) }))
class Analysis extends Component { class Analysis extends Component {
state = { state = {
loading: true,
salesType: 'all', salesType: 'all',
currentTabKey: '', currentTabKey: '',
rangePickerValue: getTimeDistance('year'), rangePickerValue: getTimeDistance('year'),
...@@ -30,6 +31,11 @@ class Analysis extends Component { ...@@ -30,6 +31,11 @@ class Analysis extends Component {
type: 'chart/fetch', type: 'chart/fetch',
}); });
}); });
setTimeout(() => {
this.setState({
loading: false,
});
}, 2000);
} }
componentWillUnmount() { componentWillUnmount() {
...@@ -90,8 +96,9 @@ class Analysis extends Component { ...@@ -90,8 +96,9 @@ class Analysis extends Component {
}; };
render() { render() {
const { rangePickerValue, salesType, currentTabKey } = this.state; const { rangePickerValue, salesType, currentTabKey, loading: stateLoading } = this.state;
const { chart, loading } = this.props; const { chart, loading: propsLoading } = this.props;
const loading = stateLoading || propsLoading;
const { const {
visitData, visitData,
visitData2, visitData2,
......
...@@ -12,6 +12,157 @@ ...@@ -12,6 +12,157 @@
</head> </head>
<body> <body>
<noscript>Sorry, we need js to run correctly!</noscript> <noscript>Sorry, we need js to run correctly!</noscript>
<div id="root"></div> <div id="root">
<style>
.page-loading-warp {
padding: 120px;
display: flex;
justify-content: center;
align-items: center;
}
.ant-spin {
-webkit-box-sizing: border-box;
box-sizing: border-box;
margin: 0;
padding: 0;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
font-variant: tabular-nums;
line-height: 1.5;
list-style: none;
-webkit-font-feature-settings: 'tnum';
font-feature-settings: 'tnum';
position: absolute;
display: none;
color: #1890ff;
text-align: center;
vertical-align: middle;
opacity: 0;
-webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86),
-webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
}
.ant-spin-spinning {
position: static;
display: inline-block;
opacity: 1;
}
.ant-spin-dot {
position: relative;
display: inline-block;
font-size: 20px;
width: 20px;
height: 20px;
}
.ant-spin-dot-item {
position: absolute;
display: block;
width: 9px;
height: 9px;
background-color: #1890ff;
border-radius: 100%;
-webkit-transform: scale(0.75);
-ms-transform: scale(0.75);
transform: scale(0.75);
-webkit-transform-origin: 50% 50%;
-ms-transform-origin: 50% 50%;
transform-origin: 50% 50%;
opacity: 0.3;
-webkit-animation: antSpinMove 1s infinite linear alternate;
animation: antSpinMove 1s infinite linear alternate;
}
.ant-spin-dot-item:nth-child(1) {
top: 0;
left: 0;
}
.ant-spin-dot-item:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
}
.ant-spin-dot-item:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: 0.8s;
animation-delay: 0.8s;
}
.ant-spin-dot-item:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s;
}
.ant-spin-dot-spin {
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
-webkit-animation: antRotate 1.2s infinite linear;
animation: antRotate 1.2s infinite linear;
}
.ant-spin-lg .ant-spin-dot {
font-size: 32px;
width: 32px;
height: 32px;
}
.ant-spin-lg .ant-spin-dot i {
width: 14px;
height: 14px;
}
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.ant-spin-blur {
background: #fff;
opacity: 0.5;
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1;
}
}
@keyframes antSpinMove {
to {
opacity: 1;
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg);
}
}
</style>
<div class="page-loading-warp">
<div class="ant-spin ant-spin-lg ant-spin-spinning">
<span class="ant-spin-dot ant-spin-dot-spin"
><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i
><i class="ant-spin-dot-item"></i><i class="ant-spin-dot-item"></i
></span>
</div>
</div>
</div>
</body> </body>
</html> </html>
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