有時候在改變狀態時需要進行校驗,校驗成功后才能改變值
組件代碼如下(ts寫法)
1 <script lang="ts"> 2 import { Component, Vue, Prop } from "vue-property-decorator"; 3 import { Switch } from "element-ui"; 4 /** 5 * 6 * element-switch組件增強,支持在狀態改變前攔截change事件 7 * 8 * 用法和element-switch一樣 9 * 10 * {Function} beforChange 同步攔截change事件 11 * 12 * {Function} beforPromiseChange 異步攔截change事件 13 * 14 */ 15 @Component({ 16 // 繼承element-switch 17 extends: Switch, 18 name: "ZbSwitch" 19 }) 20 export default class ZbSwitch extends Vue { 21 // 同步攔截change事件 22 @Prop() beforChange!: Function; 23 // 異步攔截change事件 24 @Prop() beforPromiseChange!: Function; 25 // 額外綁定的值 26 @Prop() data!: any; 27 // 重寫方法,支持攔截狀態改變 28 handleChange() { 29 const me = this as any, 30 val = me.checked ? me.inactiveValue : me.activeValue, 31 data = me.data; 32 // 如果有配置beforChange那么return true才不會攔截后續動作 33 if (me.beforChange) { 34 if (me.beforChange(data)) { 35 me.checkChange(val); 36 } 37 } else if (me.beforPromiseChange) { 38 // 如果有配置beforPromiseChange那么resolve();才不會攔截后續動作 39 me.beforPromiseChange(data).then(() => { 40 me.checkChange(val); 41 }); 42 } else { 43 me.checkChange(val); 44 } 45 } 46 // 攔截攔截狀態改變后處理相關邏輯 47 checkChange(val: any) { 48 const me = this as any; 49 // 拋出事件 50 me.$emit("input", val); 51 me.$emit("change", val); 52 me.$nextTick(() => { 53 // set input's checked property 54 // in case parent refuses to change component's value 55 me.$refs.input.checked = me.checked; 56 }); 57 } 58 } 59 </script>
使用
1 <template> 2 <div> 3 <div class="bh bstart"> 4 同步攔截change事件:  5 <zb-switch 6 v-model="value" 7 :beforChange="onChange" 8 :data="{ is: true }" 9 ></zb-switch 10 > 通過  11 <zb-switch 12 v-model="value" 13 :beforChange="onChange" 14 :data="{ is: false }" 15 ></zb-switch 16 > 不通過 17 </div> 18 <br /> 19 <div class="bh bstart"> 20 異步攔截change事件:  21 <zb-switch 22 v-model="value" 23 :beforPromiseChange="onPromiseChange" 24 :data="{ is: true }" 25 ></zb-switch 26 > 通過  27 <zb-switch 28 v-model="value" 29 :beforPromiseChange="onPromiseChange" 30 :data="{ is: false }" 31 ></zb-switch 32 > 不通過 33 </div> 34 </div> 35 </template> 36 <script lang="ts"> 37 import { Component, Vue } from "vue-property-decorator"; 38 import message from "@/utils/Message"; 39 @Component({ name: "elementSwitch" }) 40 export default class elementSwitch extends Vue { 41 // 綁定值 42 value: boolean = true; 43 // 同步攔截,返回ture則通過驗證 44 onChange(data) { 45 console.log("是否通過驗證", data.is); 46 return data.is; 47 } 48 // 異步攔截,返回resolve()則通過驗證 49 onPromiseChange(data) { 50 message.loading("正在異步請求..."); 51 return new Promise((resolve) => { 52 setTimeout(() => { 53 console.log("是否通過驗證", data.is); 54 if (data.is) { 55 resolve({}); 56 } 57 message.clear(); 58 }, 500); 59 }); 60 } 61 } 62 </script>