Commit eb7f31db00f8aad1a17692d251f11172c2c2c9cd
1 parent
ac2f8493
Switch add loading prop
Showing
3 changed files
with
65 additions
and
9 deletions
Show diff stats
examples/routers/switch.vue
| 1 | <template> | 1 | <template> |
| 2 | <div> | 2 | <div> |
| 3 | - <i-switch v-model="m1" true-value="yes" false-value="no"> | 3 | + <i-switch v-model="m1" :loading="loading"> |
| 4 | <span slot="open">开</span> | 4 | <span slot="open">开</span> |
| 5 | <span slot="close">关</span> | 5 | <span slot="close">关</span> |
| 6 | </i-switch> | 6 | </i-switch> |
| 7 | {{ m1 }} | 7 | {{ m1 }} |
| 8 | - <div @click="m1 = 'no'">toggle</div> | 8 | + <div @click="m1 = !m1">toggle</div> |
| 9 | + <div @click="loading = !loading">loading</div> | ||
| 9 | <br><br> | 10 | <br><br> |
| 10 | - <i-switch size="large"></i-switch> | 11 | + <i-switch size="large" loading></i-switch> |
| 11 | <i-switch></i-switch> | 12 | <i-switch></i-switch> |
| 12 | - <i-switch size="small"></i-switch> | 13 | + <i-switch size="small" v-model="m1" :loading="loading"></i-switch> |
| 13 | <br><br> | 14 | <br><br> |
| 14 | <i-switch> | 15 | <i-switch> |
| 15 | <span slot="open">开</span> | 16 | <span slot="open">开</span> |
| @@ -24,7 +25,7 @@ | @@ -24,7 +25,7 @@ | ||
| 24 | <span slot="open">开启</span> | 25 | <span slot="open">开启</span> |
| 25 | <span slot="close">关闭</span> | 26 | <span slot="close">关闭</span> |
| 26 | </i-switch> | 27 | </i-switch> |
| 27 | - <i-switch size="large"> | 28 | + <i-switch size="large" v-model="m1" :loading="loading"> |
| 28 | <span slot="open">ON</span> | 29 | <span slot="open">ON</span> |
| 29 | <span slot="close">OFF</span> | 30 | <span slot="close">OFF</span> |
| 30 | </i-switch> | 31 | </i-switch> |
| @@ -37,8 +38,9 @@ | @@ -37,8 +38,9 @@ | ||
| 37 | export default { | 38 | export default { |
| 38 | data () { | 39 | data () { |
| 39 | return { | 40 | return { |
| 40 | - m1: 'yes', | ||
| 41 | - disabled: true | 41 | + m1: true, |
| 42 | + disabled: true, | ||
| 43 | + loading: false | ||
| 42 | } | 44 | } |
| 43 | }, | 45 | }, |
| 44 | methods: { | 46 | methods: { |
src/components/switch/switch.vue
| @@ -45,6 +45,10 @@ | @@ -45,6 +45,10 @@ | ||
| 45 | }, | 45 | }, |
| 46 | name: { | 46 | name: { |
| 47 | type: String | 47 | type: String |
| 48 | + }, | ||
| 49 | + loading: { | ||
| 50 | + type: Boolean, | ||
| 51 | + default: false | ||
| 48 | } | 52 | } |
| 49 | }, | 53 | }, |
| 50 | data () { | 54 | data () { |
| @@ -59,7 +63,8 @@ | @@ -59,7 +63,8 @@ | ||
| 59 | { | 63 | { |
| 60 | [`${prefixCls}-checked`]: this.currentValue === this.trueValue, | 64 | [`${prefixCls}-checked`]: this.currentValue === this.trueValue, |
| 61 | [`${prefixCls}-disabled`]: this.disabled, | 65 | [`${prefixCls}-disabled`]: this.disabled, |
| 62 | - [`${prefixCls}-${this.size}`]: !!this.size | 66 | + [`${prefixCls}-${this.size}`]: !!this.size, |
| 67 | + [`${prefixCls}-loading`]: this.loading, | ||
| 63 | } | 68 | } |
| 64 | ]; | 69 | ]; |
| 65 | }, | 70 | }, |
| @@ -70,7 +75,7 @@ | @@ -70,7 +75,7 @@ | ||
| 70 | methods: { | 75 | methods: { |
| 71 | toggle (event) { | 76 | toggle (event) { |
| 72 | event.preventDefault(); | 77 | event.preventDefault(); |
| 73 | - if (this.disabled) { | 78 | + if (this.disabled || this.loading) { |
| 74 | return false; | 79 | return false; |
| 75 | } | 80 | } |
| 76 | 81 |
src/styles/components/switch.less
| @@ -14,6 +14,10 @@ | @@ -14,6 +14,10 @@ | ||
| 14 | user-select: none; | 14 | user-select: none; |
| 15 | transition: all @transition-time @ease-in-out; | 15 | transition: all @transition-time @ease-in-out; |
| 16 | 16 | ||
| 17 | + &-loading{ | ||
| 18 | + opacity: .4; | ||
| 19 | + } | ||
| 20 | + | ||
| 17 | &-inner { | 21 | &-inner { |
| 18 | color: #fff; | 22 | color: #fff; |
| 19 | font-size: @font-size-small; | 23 | font-size: @font-size-small; |
| @@ -44,6 +48,26 @@ | @@ -44,6 +48,26 @@ | ||
| 44 | width: 26px; | 48 | width: 26px; |
| 45 | } | 49 | } |
| 46 | 50 | ||
| 51 | + &:before{ | ||
| 52 | + content: ''; | ||
| 53 | + display: none; | ||
| 54 | + width: 14px; | ||
| 55 | + height: 14px; | ||
| 56 | + border-radius: 50%; | ||
| 57 | + background-color: transparent; | ||
| 58 | + position: absolute; | ||
| 59 | + left: 3px; | ||
| 60 | + top: 3px; | ||
| 61 | + z-index: 1; | ||
| 62 | + border: 1px solid @primary-color; | ||
| 63 | + border-color: transparent transparent transparent @primary-color; | ||
| 64 | + animation: switch-loading 1s linear; | ||
| 65 | + animation-iteration-count: infinite; | ||
| 66 | + } | ||
| 67 | + &-loading:before{ | ||
| 68 | + display: block; | ||
| 69 | + } | ||
| 70 | + | ||
| 47 | &:focus { | 71 | &:focus { |
| 48 | box-shadow: 0 0 0 2px fade(@primary-color, 20%); | 72 | box-shadow: 0 0 0 2px fade(@primary-color, 20%); |
| 49 | outline: 0; | 73 | outline: 0; |
| @@ -64,11 +88,20 @@ | @@ -64,11 +88,20 @@ | ||
| 64 | &:active:after { | 88 | &:active:after { |
| 65 | width: 14px; | 89 | width: 14px; |
| 66 | } | 90 | } |
| 91 | + &:before{ | ||
| 92 | + width: 10px; | ||
| 93 | + height: 10px; | ||
| 94 | + left: 2px; | ||
| 95 | + top: 2px; | ||
| 96 | + } | ||
| 67 | } | 97 | } |
| 68 | 98 | ||
| 69 | &-small&-checked:after { | 99 | &-small&-checked:after { |
| 70 | left: 13px; | 100 | left: 13px; |
| 71 | } | 101 | } |
| 102 | + &-small&-checked:before { | ||
| 103 | + left: 14px; | ||
| 104 | + } | ||
| 72 | 105 | ||
| 73 | &-small:active&-checked:after { | 106 | &-small:active&-checked:after { |
| 74 | left: 11px; | 107 | left: 11px; |
| @@ -88,6 +121,9 @@ | @@ -88,6 +121,9 @@ | ||
| 88 | &-large&-checked:after { | 121 | &-large&-checked:after { |
| 89 | left: 35px; | 122 | left: 35px; |
| 90 | } | 123 | } |
| 124 | + &-large&-checked:before { | ||
| 125 | + left: 37px; | ||
| 126 | + } | ||
| 91 | 127 | ||
| 92 | &-large:active&-checked:after { | 128 | &-large:active&-checked:after { |
| 93 | left: 23px; | 129 | left: 23px; |
| @@ -104,6 +140,9 @@ | @@ -104,6 +140,9 @@ | ||
| 104 | &:after { | 140 | &:after { |
| 105 | left: 23px; | 141 | left: 23px; |
| 106 | } | 142 | } |
| 143 | + &:before{ | ||
| 144 | + left: 25px; | ||
| 145 | + } | ||
| 107 | 146 | ||
| 108 | &:active:after { | 147 | &:active:after { |
| 109 | left: 15px; | 148 | left: 15px; |
| @@ -124,4 +163,14 @@ | @@ -124,4 +163,14 @@ | ||
| 124 | color: #ccc; | 163 | color: #ccc; |
| 125 | } | 164 | } |
| 126 | } | 165 | } |
| 166 | + | ||
| 127 | } | 167 | } |
| 168 | + | ||
| 169 | +@keyframes switch-loading { | ||
| 170 | + 0% { | ||
| 171 | + transform: rotate(0); | ||
| 172 | + } | ||
| 173 | + 100% { | ||
| 174 | + transform: rotate(360deg); | ||
| 175 | + } | ||
| 176 | +} | ||
| 128 | \ No newline at end of file | 177 | \ No newline at end of file |