这篇文章将为大家详细讲解有关怎么在vue中利用mixin优化表单验证插件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> 1。实际开发中遇到的问题强>
在上面的文章中提及了一些表单插件的问题,主要针对的是插件开发本身存在的问题。下面我总结下使用中存在的问题:
每个使用表单校验的元素都需要添加,<代码> v-check> 代码类名,比较麻烦。
必须在提交表单按钮上使用,<代码> v-checkSubmit> 代码指令进行表单校验,提交函数必须命名为,<代码> submit()> 代码,而且二者还是绑定的。
无法在一个组件里面多次使用校验函数,无法自定义校验的表单范围。(严重问题)
<强> 2。对问题进行分析强>
一开始我的目标是按照之前计划的方向,研究如何使用事件订阅发布来实现表单校验,但是评估之后这种方式会对现有的代码改动较大,因为我项目已经几处用了当前的校验方法,遂放弃这个方向。
经过查阅资料和思考,我发现vue本身是没有直接处理,生成dom元素的api。所以当前的这种方法(根据校验结果添加类名,输入错误,并追加错误信息元素)虽然不优雅,但是确实最简单有效的方式了。在这个基础上针对上面列出的几个问题,我分别整理了解决的思路:
<代码> v-check 代码>
<强> 3。实现强>
绑定自定义指令的时候添加<代码>,v-check 代码>
import Vue 得到& # 39;vue # 39; export default  { 安装:大敌;(Vue,选项),=祝辞,{ ,Vue.directive (& # 39; validateParams& # 39;,, { 插入才能:function (el,绑定,vNode), { ,/* *,才能解决办法只需添加下面这一行代码即可 *,才能el即为当前指令绑定的元素,classList.add可以给元素添加类名 ,*/el.classList.add才能(& # 39;v-check& # 39;); el.addEventListener才能(& # 39;模糊# 39;,,function (事件),{//,,,… })才能 ,,} ,}); ,} }
定义公共的表单校验方法
如何在vu <代码> e打印稿> 代码中使用mixin呢
//, mixin.ts import {组件的不同之处是,Vue },得到& # 39;vue-property-decorator& # 39;; @ component ({}) export class  Demo extends Vue  { ,public 答:string =, & # 39;一个# 39;; ,public doSomething (), { ,} }//组件 & lt; template> & lt;/template> & lt; script  lang=皌s"祝辞 import {,组件,Vue, Mixins },得到& # 39;vue-property-decorator& # 39;; {},Demo  import 得到& # 39;mixin.ts& # 39;; @ component ({}) export class  App extends  mixin(演示),{ ,private 创建(),{ ,console.log (this.A);,//,会打印出 ,} } & lt;/script>
下面我们实践,在表单插件中定义这个被mixin的校验方法
@ component ({}) export class  ValidatorMixin extends Vue  { ,/* ,*定义一个GValidate方法,可以接受一个元素节点参数 *大敌;参数定义了表单函数校验的范围 ,*/,public GValidate (validateEl ?: HTMLElement), { ,//默认是查找当前组件实例内的.v-check元素,这个。美元el表示当前组件 ,let elements =,。美元el.querySelectorAll (& # 39; .v-check& # 39;); ,if (, validateEl ), {//,才能有参数时,规定了校验的范围 elements 才能=,validateEl.querySelectorAll (& # 39; .v-check& # 39;); ,} ,const evObj =, document.createEvent(& # 39;事件# 39;); ,evObj.initEvent(& # 39;模糊# 39;,,真的,,真的); ,if (元素),{ for 才能;(const element  of 元素),{ element.dispatchEvent才能(evObj); ,,} ,} ,//还是查找.input-error元素,以此来判断检验结果 ,let errorInputs =,。美元el.querySelectorAll (& # 39; .input-error& # 39;); ,if (validateEl), { errorInputs 才能=,validateEl.querySelectorAll (& # 39; .input-error& # 39;); ,} ,//将校验的结果返回 ,if (errorInputs.length !==, 0), { return 才能;假; ,}else { return 才能;真实; ,} ,} }
定义了上面的校验方法之后,可以将原插件里面定义,<代码> v-checkSubmit> 代码指令的部分删除了。
<强> 4。优化后的使用强>