form-create icon indicating copy to clipboard operation
form-create copied to clipboard

自定义组件在值更新前触发了校验,导致校验出问题

Open Lysom opened this issue 4 years ago • 9 comments

@form-create/[email protected]

[email protected]

如题

自定义组件设置了validate必填校验,trigger: ['blur', 'change'],在点击自定义组件中radio时,校验在更新值之前触发

期望在更新值之后触发校验,以得到正确的校验结果

Lysom avatar Aug 23 '21 07:08 Lysom

在值更新后,没有再次触发校验

Lysom avatar Aug 23 '21 07:08 Lysom

验证功能用的 elementUI框架内置的, 它是通过事件来触发验证的.如果你想用处理过的值去验证是不行的. 建议通过自定义验证函数来验证

xaboy avatar Aug 23 '21 07:08 xaboy

是写的自定义验证函数校验的必填,在自定义组件内部通过this.$emit('input', val)的形式更新form-create值,没有做额外处理,在点选单选之后,优先触发了校验函数,校验中value为undefined,在之后才执行了this.$emit('input', val),而且在执行更新之后并没有触发第二次校验,导致校验不通过

Lysom avatar Aug 23 '21 08:08 Lysom

你把 trigger改成input试试

xaboy avatar Aug 23 '21 08:08 xaboy

改成 input 之后,不触发自定义校验函数

Lysom avatar Aug 23 '21 08:08 Lysom

我这边测试正常

//自定义组件
Vue.component('test-input', {
    data(){
        return {
            val:''
        }
    },
    render(h) {
        return h('el-input', {props:{value:this.val},on:{input:(v)=>{
            this.val = v;
            this.$emit('input',v);
            this.$emit('change',v);
                }}});
    }
})

rule:

maker.create('test-input','test-input','test-input').validate([{type:'string',required:true,trigger:'change'}]),

xaboy avatar Aug 23 '21 08:08 xaboy

我这边反复测试了一下,发现必须要用 :value 的形式才行,如果用 v-model 的形式绑定自定义组件,就会出现问题

Lysom avatar Aug 23 '21 09:08 Lysom

我这边自定义组件是el-radio-group

Lysom avatar Aug 23 '21 09:08 Lysom

可能是验证事件触发的比 input 事件早,所以导致 form-create内的数据还没有更新就触发了验证

xaboy avatar Aug 24 '21 07:08 xaboy