用過easyui的,應該清楚easyui組件有不少before事件攔截,有時候會特別重要。vue
最近在研究vue的ui組件iview雖然功能也不錯,感受仍是沒有像easyui那樣強大,就好比before事件攔截。app
不過也想到了解決方案: props傳入函數參數,這裏以Switch組件爲例(顏色標識的爲額外添加的代碼)iview
<template> <span :class="wrapClasses" @click="toggle"> <span :class="innerClasses"> <slot name="open" v-if="currentValue"></slot> <slot name="close" v-if="!currentValue"></slot> </span> </span> </template> <script> import { oneOf } from '../../utils/assist'; import Emitter from '../../mixins/emitter'; const prefixCls = 'ivu-switch'; export default { name: 'Switch', mixins: [ Emitter ], props: { value: { type: Boolean, default: false }, disabled: { type: Boolean, default: false }, size: { validator (value) { return oneOf(value, ['large', 'small']); } }, beforeChange: { type: Function } }, data () { return { currentValue: this.value }; }, computed: { wrapClasses () { return [ `${prefixCls}`, { [`${prefixCls}-checked`]: this.currentValue, [`${prefixCls}-disabled`]: this.disabled, [`${prefixCls}-${this.size}`]: !!this.size } ]; }, innerClasses () { return `${prefixCls}-inner`; } }, methods: { toggle () { if (this.disabled) { return false; } if(this.beforeChange && (typeof this.beforeChange=='function')) { var status = this.beforeChange.apply(this,[this.currentValue]); if(status == false) return false; } const checked = !this.currentValue; this.currentValue = checked; this.$emit('input', checked); this.$emit('on-change', checked); this.dispatch('FormItem', 'on-form-change', checked); } }, watch: { value (val) { this.currentValue = val; } } }; </script>