Merge branch 'master' of https://github.com/vueComponent/ant-design
commit
702a22b227
@ -0,0 +1,142 @@
|
||||
<script>
|
||||
import PropTypes from '../_util/vue-types'
|
||||
import BaseMixin from '../_util/BaseMixin'
|
||||
import isCssAnimationSupported from '../_util/isCssAnimationSupported'
|
||||
import animate from '../_util/css-animation'
|
||||
|
||||
export default {
|
||||
name: 'Spin',
|
||||
mixins: [BaseMixin],
|
||||
props: {
|
||||
prefixCls: PropTypes.string.def('ant-spin'),
|
||||
spinning: PropTypes.bool.def(true),
|
||||
size: PropTypes.oneOf(['small', 'default', 'large']).def('default'),
|
||||
wrapperClassName: PropTypes.string.def(''),
|
||||
tip: PropTypes.string,
|
||||
delay: PropTypes.number,
|
||||
},
|
||||
data () {
|
||||
const { spinning } = this
|
||||
return {
|
||||
stateSpinning: spinning,
|
||||
debounceTimeout: null,
|
||||
delayTimeout: null,
|
||||
notCssAnimationSupported: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getHasDefaultSlots () {
|
||||
return this.$slots && this.$slots.default
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
if (!isCssAnimationSupported()) {
|
||||
// Show text in IE9
|
||||
this.setState({
|
||||
notCssAnimationSupported: true,
|
||||
})
|
||||
}
|
||||
},
|
||||
beforeDestroy () {
|
||||
if (this.debounceTimeout) {
|
||||
clearTimeout(this.debounceTimeout)
|
||||
}
|
||||
if (this.delayTimeout) {
|
||||
clearTimeout(this.delayTimeout)
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
spinning (val) {
|
||||
const { delay, stateSpinning, spinning } = this
|
||||
|
||||
if (this.debounceTimeout) {
|
||||
clearTimeout(this.debounceTimeout)
|
||||
}
|
||||
if (stateSpinning && !spinning) {
|
||||
this.debounceTimeout = window.setTimeout(() => this.setState({ stateSpinning: spinning }), 200)
|
||||
if (this.delayTimeout) {
|
||||
clearTimeout(this.delayTimeout)
|
||||
}
|
||||
} else {
|
||||
if (spinning && delay && !isNaN(Number(delay))) {
|
||||
if (this.delayTimeout) {
|
||||
clearTimeout(this.delayTimeout)
|
||||
}
|
||||
this.delayTimeout = window.setTimeout(() => this.setState({ stateSpinning: spinning }), delay)
|
||||
} else {
|
||||
this.setState({ stateSpinning: spinning })
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
render () {
|
||||
const { size, prefixCls, tip, wrapperClassName, ...restProps } = this.$props
|
||||
const { notCssAnimationSupported, $slots, stateSpinning } = this
|
||||
|
||||
const spinClassName = {
|
||||
[prefixCls]: true,
|
||||
[`${prefixCls}-sm`]: size === 'small',
|
||||
[`${prefixCls}-lg`]: size === 'large',
|
||||
[`${prefixCls}-spinning`]: stateSpinning,
|
||||
[`${prefixCls}-show-text`]: !!tip || notCssAnimationSupported,
|
||||
}
|
||||
|
||||
const spinIndicator = $slots.indicator ? $slots.indicator : (
|
||||
<span class={`${prefixCls}-dot`}>
|
||||
<i />
|
||||
<i />
|
||||
<i />
|
||||
<i />
|
||||
</span>
|
||||
)
|
||||
|
||||
const spinElement = (
|
||||
<div {...restProps} class={spinClassName} >
|
||||
{spinIndicator}
|
||||
{tip ? <div class={`${prefixCls}-text`}>{tip}</div> : null}
|
||||
</div>
|
||||
)
|
||||
|
||||
if (this.getHasDefaultSlots()) {
|
||||
let animateClassName = prefixCls + '-nested-loading'
|
||||
if (wrapperClassName) {
|
||||
animateClassName += ' ' + wrapperClassName
|
||||
}
|
||||
const containerClassName = {
|
||||
[`${prefixCls}-container`]: true,
|
||||
[`${prefixCls}-blur`]: stateSpinning,
|
||||
}
|
||||
|
||||
const transitionProps = {
|
||||
props: Object.assign({
|
||||
appear: true,
|
||||
css: false,
|
||||
}),
|
||||
}
|
||||
const transitionEvent = {
|
||||
enter: (el, done) => {
|
||||
animate(el, 'fade-enter', done)
|
||||
},
|
||||
leave: (el, done) => {
|
||||
animate(el, 'fade-leave', done)
|
||||
},
|
||||
}
|
||||
|
||||
transitionProps.on = transitionEvent
|
||||
|
||||
return (<transition
|
||||
{...transitionProps}
|
||||
>
|
||||
<div class={animateClassName}>
|
||||
{stateSpinning && <div key='loading'>{spinElement}</div>}
|
||||
<div class={containerClassName} key='container'>
|
||||
{this.$slots.default}
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
)
|
||||
}
|
||||
return spinElement
|
||||
},
|
||||
}
|
||||
</script>
|
@ -0,0 +1,17 @@
|
||||
<cn>
|
||||
#### 基本用法
|
||||
一个简单的 loading 状态。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### basic Usage
|
||||
A simple loading status.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<template>
|
||||
<div>
|
||||
<a-spin />
|
||||
</div>
|
||||
</template>
|
||||
```
|
@ -0,0 +1,19 @@
|
||||
<cn>
|
||||
#### 自定义指示符
|
||||
使用自定义指示符。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### Custom spinning indicator
|
||||
Use custom loading indicator.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<template>
|
||||
<div>
|
||||
<a-spin>
|
||||
<a-icon slot="indicator" type="loading" style="font-size: 24px" spin />
|
||||
</a-spin>
|
||||
</div>
|
||||
</template>
|
||||
```
|
@ -0,0 +1,44 @@
|
||||
<cn>
|
||||
#### 延迟
|
||||
延迟显示 loading 效果。当 spinning 状态在 `delay` 时间内结束,则不显示 loading 状态。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### delay
|
||||
Specifies a delay for loading state. If `spinning` ends during delay, loading status won't appear.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<style>
|
||||
.spin-content{
|
||||
border: 1px solid #91d5ff;
|
||||
background-color: #e6f7ff;
|
||||
padding: 30px;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div>
|
||||
<a-spin :spinning="spinning" :delay="delayTime">
|
||||
<div class="spin-content">
|
||||
可以点击‘切换’按钮,延迟显示 loading 效果。当 spinning 状态在 `delay` 时间内结束,则不显示 loading 状态。
|
||||
</div>
|
||||
</a-spin>
|
||||
<a-button @click="changeSpinning" style="margin-top: 5px">切换</a-button>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
spinning: false,
|
||||
delayTime: 500,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
changeSpinning(){
|
||||
this.spinning = !this.spinning
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
```
|
@ -0,0 +1,27 @@
|
||||
<cn>
|
||||
#### 容器
|
||||
放入一个容器中。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### Inside a container
|
||||
Spin in a container.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<style>
|
||||
.example {
|
||||
text-align: center;
|
||||
background: rgba(0,0,0,0.05);
|
||||
border-radius: 4px;
|
||||
margin-bottom: 20px;
|
||||
padding: 30px 50px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div class="example">
|
||||
<a-spin />
|
||||
</div>
|
||||
</template>
|
||||
```
|
@ -0,0 +1,19 @@
|
||||
<cn>
|
||||
#### 各种大小
|
||||
小的用于文本加载,默认用于卡片容器级加载,大的用于**页面级**加载。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### Size
|
||||
A small `Spin` use in loading text, default `Spin` use in loading card-level block, and large `Spin` use in loading **page**.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<template>
|
||||
<div>
|
||||
<a-spin size="small" />
|
||||
<a-spin />
|
||||
<a-spin size="large" />
|
||||
</div>
|
||||
</template>
|
||||
```
|
@ -0,0 +1,28 @@
|
||||
<cn>
|
||||
#### 自定义描述文案
|
||||
自定义描述文案。
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
#### Customized description
|
||||
Customized description content.
|
||||
</us>
|
||||
|
||||
```html
|
||||
<style>
|
||||
.spin-content{
|
||||
border: 1px solid #91d5ff;
|
||||
background-color: #e6f7ff;
|
||||
padding: 30px;
|
||||
}
|
||||
</style>
|
||||
<template>
|
||||
<div>
|
||||
<a-spin tip="Loading...">
|
||||
<div class="spin-content">
|
||||
我的描述文案是自定义的。。。
|
||||
</div>
|
||||
</a-spin>
|
||||
</div>
|
||||
</template>
|
||||
```
|
@ -0,0 +1,11 @@
|
||||
|
||||
## API
|
||||
|
||||
| Property | Description | Type | Default Value |
|
||||
| -------- | ----------- | ---- | ------------- |
|
||||
| delay | specifies a delay in milliseconds for loading state (prevent flush) | number (milliseconds) | - |
|
||||
| indicator | React node of the spinning indicator | slot | - |
|
||||
| size | size of Spin, options: `small`, `default` and `large` | string | `default` |
|
||||
| spinning | whether Spin is spinning | boolean | true |
|
||||
| tip | customize description content when Spin has children | string | - |
|
||||
| wrapperClassName | className of wrapper when Spin has children | string | - |
|
@ -0,0 +1,3 @@
|
||||
import Spin from './Spin'
|
||||
|
||||
export default Spin
|
@ -0,0 +1,11 @@
|
||||
|
||||
## API
|
||||
|
||||
| 参数 | 说明 | 类型 | 默认值 |
|
||||
| --- | --- | --- | --- |
|
||||
| delay | 延迟显示加载效果的时间(防止闪烁) | number (毫秒) | - |
|
||||
| indicator | 加载指示符 | slot方式 | - |
|
||||
| size | 组件大小,可选值为 `small` `default` `large` | string | 'default' |
|
||||
| spinning | 是否旋转 | boolean | true |
|
||||
| tip | 当作为包裹元素时,可以自定义描述文案 | string | - |
|
||||
| wrapperClassName | 包装器的类属性 | string | - |
|
@ -0,0 +1,2 @@
|
||||
import '../../style/index.less'
|
||||
import './index.less'
|
@ -0,0 +1,196 @@
|
||||
@import "../../style/themes/default";
|
||||
@import "../../style/mixins/index";
|
||||
|
||||
@spin-prefix-cls: ~"@{ant-prefix}-spin";
|
||||
@spin-dot-default: @text-color-secondary;
|
||||
|
||||
.@{spin-prefix-cls} {
|
||||
.reset-component;
|
||||
color: @primary-color;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
transition: transform 0.3s @ease-in-out-circ;
|
||||
display: none;
|
||||
|
||||
&-spinning {
|
||||
opacity: 1;
|
||||
position: static;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
&-nested-loading {
|
||||
position: relative;
|
||||
> div > .@{spin-prefix-cls} {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
max-height: 320px;
|
||||
width: 100%;
|
||||
z-index: 4;
|
||||
.@{spin-prefix-cls}-dot {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin: -@spin-dot-size / 2;
|
||||
}
|
||||
.@{spin-prefix-cls}-text {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: 100%;
|
||||
padding-top: (@spin-dot-size - @font-size-base) / 2 + 2px;
|
||||
text-shadow: 0 1px 2px #fff;
|
||||
}
|
||||
&.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {
|
||||
margin-top: -@spin-dot-size / 2 - 10px;
|
||||
}
|
||||
}
|
||||
|
||||
> div > .@{spin-prefix-cls}-sm {
|
||||
.@{spin-prefix-cls}-dot {
|
||||
margin: -@spin-dot-size-sm / 2;
|
||||
}
|
||||
.@{spin-prefix-cls}-text {
|
||||
padding-top: (@spin-dot-size-sm - @font-size-base) / 2 + 2px;
|
||||
}
|
||||
&.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {
|
||||
margin-top: -@spin-dot-size-sm / 2 - 10px;
|
||||
}
|
||||
}
|
||||
|
||||
> div > .@{spin-prefix-cls}-lg {
|
||||
.@{spin-prefix-cls}-dot {
|
||||
margin: -@spin-dot-size-lg / 2;
|
||||
}
|
||||
.@{spin-prefix-cls}-text {
|
||||
padding-top: (@spin-dot-size-lg - @font-size-base) / 2 + 2px;
|
||||
}
|
||||
&.@{spin-prefix-cls}-show-text .@{spin-prefix-cls}-dot {
|
||||
margin-top: -@spin-dot-size-lg / 2 - 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-container {
|
||||
position: relative;
|
||||
.clearfix;
|
||||
}
|
||||
|
||||
&-blur {
|
||||
overflow: hidden;
|
||||
opacity: 0.7;
|
||||
-webkit-filter: blur(0.5px);
|
||||
filter: blur(0.5px);
|
||||
|
||||
/* autoprefixer: off */
|
||||
filter: ~"progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, MakeShadow\=false)";
|
||||
// workround for a strange style bug in safari:
|
||||
// https://github.com/ant-design/ant-design/issues/4622
|
||||
// have no clue why this works
|
||||
-webkit-transform: translateZ(0);
|
||||
&:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background: #fff;
|
||||
opacity: 0.3;
|
||||
transition: all .3s;
|
||||
z-index: 10;
|
||||
}
|
||||
}
|
||||
|
||||
// tip
|
||||
// ------------------------------
|
||||
&-tip {
|
||||
color: @spin-dot-default;
|
||||
}
|
||||
|
||||
// dots
|
||||
// ------------------------------
|
||||
|
||||
&-dot {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
.square(@spin-dot-size);
|
||||
transform: rotate(45deg);
|
||||
animation: antRotate 1.2s infinite linear;
|
||||
i {
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
border-radius: 100%;
|
||||
background-color: @primary-color;
|
||||
transform: scale(0.75);
|
||||
display: block;
|
||||
position: absolute;
|
||||
opacity: 0.3;
|
||||
animation: antSpinMove 1s infinite linear alternate;
|
||||
transform-origin: 50% 50%;
|
||||
&:nth-child(1) {
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
&:nth-child(2) {
|
||||
right: 0;
|
||||
top: 0;
|
||||
animation-delay: 0.4s;
|
||||
}
|
||||
&:nth-child(3) {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
animation-delay: 0.8s;
|
||||
}
|
||||
&:nth-child(4) {
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
animation-delay: 1.2s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sizes
|
||||
// ------------------------------
|
||||
// small
|
||||
&-sm &-dot {
|
||||
.square(@spin-dot-size-sm);
|
||||
i {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
// large
|
||||
&-lg &-dot {
|
||||
.square(@spin-dot-size-lg);
|
||||
i {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
&&-show-text &-text {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
|
||||
/* IE10+ */
|
||||
.@{spin-prefix-cls}-blur {
|
||||
background: @component-background;
|
||||
opacity: 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes antSpinMove {
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes antRotate {
|
||||
to {
|
||||
transform: rotate(405deg);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue