vue2 子组件校验未通过如何通知父组件

如上图,输入框在子组件(ServiceItemInputPanel)中
输入框只能输入数字,1-9999,如果校验失败,应该让提交按钮(右边标号2)置灰
解决方案:
1,使用 vee-validate框架
官网地址:http://vee-validate.logaretm.com/api.html#directive
子组件中:
<input v-validate="'required|numeric|multiple'" data-vv-as="购买数量" data-vv-validate-on="input" @input="modifyCounter($event.target.value);validate2($validator,sharedState)" name="multiple2" :value="sharedState.multiple" type="text" >
校验属性说明:
v-validate 表示校验的格式,上例中要求必填,是数字,而且还有自定义的校验规则:multiple
data-vv-as 表示错误信息中的提示 title, 即"姓名不能为空"中的姓名.
data-vv-validate-on 表示触发校验的时机,上例中在输入过程中即时校验,说白了,就是 keyup 事件触发校验.
2,在输入过程中会调用validate2 方法,进行事件派发
methods: { validate2: throttle(function ($validator2,sharedState) { console.log('updated 111'); // console.log('this', this); $validator2.validate('multiple2').then((validateFlag) => { console.log('validateFlag', validateFlag) sharedState.bus.$emit('validatemultiple',validateFlag); }, err => { console.log('校验报错!!!!!') console.log(err) }); },500) }
把校验的结果通过 vue 的 eventbus 进行通知
3,在父组件中注册事件
在钩子事件created中进行注册:
created: function () { //做一些初始化操作 if (!this.placeorderData.userInfo){ this.placeorderData.userInfo = {} } this.sharedState.bus.$on('validatemultiple',this.validateMultiple) }
注意:
1,
data-vv-validate-on="input"
不能少,不要以为在@ input 事件中绑定了校验的方法就行.
为什么呢?
如果缺少上述语句,那么,输入过程中虽然会调用validate2方法,但是校验框架vee-validate 其实并没有同步输入框的值.
data-vv-validate-on="input" 表示在@ input 事件中同步输入框的值到vee-validate框架中
2.节流函数throttle 中使用 bind(this)不好使,因运行时的 this 并不是此时绑定的 this