使用vue中的混入mixin优化表单验证插件问题


Posted in Javascript onJuly 02, 2019

这段时间开发的时候使用到了这个表单校验插件,用起来比较麻烦就不说了,还有较严重的缺陷。自己最终还是抽空把这个插件进行了一些优化,虽然优化的方式和当初自己定下的方向不怎么相同,但是就使用体验上来说还是提高了很多。

1. 实际开发中遇到的问题

在上面的文章中提及了一些表单插件的问题,主要针对的是插件开发本身存在的问题。下面我总结下使用中存在的问题:

每个使用表单校验的元素都需要添加 v-check 类名,比较麻烦。

必须在提交表单按钮上使用 v-checkSubmit 指令进行表单校验,提交函数必须命名为 submit() ,而且二者还是绑定的。

无法在一个组件里面多次使用校验函数,无法自定义校验的表单范围。(严重问题)

2. 对问题进行分析

一开始我的目标是按照之前计划的方向,研究如何使用事件订阅发布来实现表单校验,但是评估之后这种方式会对现有的代码改动较大,因为我项目已经几处用了当前的校验方法,遂放弃这个方向。

经过查阅资料和思考,我发现vue本身是没有直接处理、生成dom元素的api。所以当前的这种方法(根据校验结果添加类名 input-error ,并追加错误信息元素)虽然不优雅,但是确实最简单有效的方式了。在这个基础上针对上面列出的几个问题,我分别整理了解决的思路:

v-check

3. 实现

绑定自定义指令的时候添加 v-check

import Vue from 'vue'
export default {
 install: (Vue, options) => {
 Vue.directive('validateParams', {
  inserted: function (el, binding, vNode) {
  /*
  * 解决办法只需添加下面这一行代码即可
  * el即为当前指令绑定的元素,classList.add可以给元素添加类名
  */
  el.classList.add('v-check');
  el.addEventListener('blur', function (event) {
   // ...
  })
  }
 });
 }
}

定义公共的表单校验方法

如何在vue typescript中使用mixin呢

// mixin.ts
import { Component, Vue } from 'vue-property-decorator';
@Component({})
export class Demo extends Vue {
 public A: string = 'A';
 public doSomething () {
 }
}
// component
<template>
</template>
<script lang="ts">
import { Component, Vue, Mixins } from 'vue-property-decorator';
import { Demo } from 'mixin.ts';
@Component({})
export class App extends Mixins(Demo) {
 private created() {
 console.log(this.A); // 会打印出A
 }
}
</script>

下面我们实践,在表单插件中定义这个被mixin的校验方法

@Component({})
export class ValidatorMixin extends Vue {
 /*
 * 定义一个GValidate方法,可以接受一个元素节点参数
 * 参数定义了表单函数校验的范围
 */
 public GValidate(validateEl?: HTMLElement) {
 // 默认是查找当前组件实例内的.v-check元素,this.$el表示当前组件
 let elements = this.$el.querySelectorAll('.v-check');
 if ( validateEl ) {
  // 有参数时,规定了校验的范围
  elements = validateEl.querySelectorAll('.v-check');
 }
 const evObj = document.createEvent('Event');
 evObj.initEvent('blur', true, true);
 if (elements) {
  for (const element of elements) {
  element.dispatchEvent(evObj);
  }
 }
 // 还是查找.input-error元素,以此来判断检验结果
 let errorInputs = this.$el.querySelectorAll('.input-error');
 if (validateEl) {
  errorInputs = validateEl.querySelectorAll('.input-error');
 }
 // 将校验的结果返回
 if (errorInputs.length !== 0) {
  return false;
 } else {
  return true;
 }
 }
}

定义了上面的校验方法之后,可以将原插件里面定义 v-checkSubmit 指令的部分删除了。

4. 优化后的使用

// rules.ts
export const required = (message) => ({
 message,
 required: true
});
export const min = (message, length=3) => ({
 message,
 min: length
})
export const max = (message, length=15) => ({
 message,
 max: length
})
export const pattern = (message, reg) => ({
 message,
 pattern: reg
})
// form.vue
<template>
 <div>
 <div class="form-item" ref="userName">
  <label for="userEmail">用户名:</label>
  <input id="userEmail" type="text" v-model="userName"
  v-validateParams="[inputNameRequired, inputNameMin, inputNameMax, inputNamePattern]">
 </div>
 <button class="btn" type="success" @click="submit">确认</button>
 </div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Mixins } from 'vue-property-decorator';
import { max, min, required, name, pattern} from 'rules';
import { yourMixin } from 'yourMixin.ts';
@Component({})
export default class Auth Mixins(youMixin) {
 private userName: string = '';
 private inputNameMax = max('请不要超过20个字符');
 private inputNameMin = min('请不要小于3个字符');
 private inputNameRequired = required('请输入用户名');
 private inputNamePattern = pattern('请输入符合要求的用户名', /^[a-zA-Z0-9_-]{4,16}$/);
 private submit() {
 const validRes = this.GValidate(); // 全局校验
 const userNameValidRes = this.GValidate(this.$refs.userName); // 单独校验某个表单
 if (validRes && userNameValidRes) {
  alert('通过校验');
 } else {
  alert('校验失败');
 }
 }
}
</script>

我们可以看到这种方式提供了一个可以访问当前组件的公共方法。当我们想校验的时候,只需要引入并使用这个方法即可。通过这种方式的改造,将表单插件内部逻辑和校验过程独立开了。校验函数只返回校验的结果,我们可以拿到这个校验结果接着写任何自己想要的逻辑,使用起来更方便。

总结

以上所述是小编给大家介绍的使用vue中的混入mixin优化表单验证插件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
jQuery统计上传文件大小的方法
Jan 24 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
jquery显示隐藏元素的实现代码
May 19 Javascript
JS组件Bootstrap Select2使用方法解析
May 30 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
Jul 04 Javascript
基于Vue单文件组件详解
Sep 15 Javascript
详解基于Vue+Koa的pm2配置
Oct 24 Javascript
vue实现的树形结构加多选框示例
Feb 02 Javascript
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
vue history 模式打包部署在域名的二级目录的配置指南
Jul 02 #Javascript
简单了解微信小程序的目录结构
Jul 01 #Javascript
vue如何实现自定义底部菜单栏
Jul 01 #Javascript
微信小程序如何利用getCurrentPages进行页面传值
Jul 01 #Javascript
vue中的面包屑导航组件实例代码
Jul 01 #Javascript
Vue动态面包屑功能的实现方法
Jul 01 #Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 #Javascript
You might like
用libTemplate实现静态网页的生成
2006/10/09 PHP
php explode函数实例代码
2012/02/27 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
jquery隔行换色效果实现方法
2015/01/15 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
微信小程序开发技巧汇总
2019/07/15 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
解决python报错MemoryError的问题
2018/06/26 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
对python中 math模块下 atan 和 atan2的区别详解
2020/01/17 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
预备党员公开承诺书
2014/05/28 职场文书
小学英语复习计划
2015/01/19 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
Python机器学习之基础概述
2021/05/19 Python
Redis性能监控的实现
2021/07/09 Redis