vue element-switch 支持在狀態改變前攔截change事件


有時候在改變狀態時需要進行校驗,校驗成功后才能改變值

組件代碼如下(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事件:&emsp;
 5             <zb-switch
 6                 v-model="value"
 7                 :beforChange="onChange"
 8                 :data="{ is: true }"
 9             ></zb-switch
10             >&nbsp;通過&emsp;
11             <zb-switch
12                 v-model="value"
13                 :beforChange="onChange"
14                 :data="{ is: false }"
15             ></zb-switch
16             >&nbsp;不通過
17         </div>
18         <br />
19         <div class="bh bstart">
20             異步攔截change事件:&emsp;
21             <zb-switch
22                 v-model="value"
23                 :beforPromiseChange="onPromiseChange"
24                 :data="{ is: true }"
25             ></zb-switch
26             >&nbsp;通過&emsp;
27             <zb-switch
28                 v-model="value"
29                 :beforPromiseChange="onPromiseChange"
30                 :data="{ is: false }"
31             ></zb-switch
32             >&nbsp;不通過
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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM