最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

vue 使用自定义指令实现表单校验的方法

来源:动视网 责编:小采 时间:2020-11-27 22:09:06
文档

vue 使用自定义指令实现表单校验的方法

vue 使用自定义指令实现表单校验的方法:笔者近期在公司的项目中使用自定义指令完成了表单校验。 这里将思路分享给大家,并写了一个小demo。这个自定义指令还需要大家自行完善。 demo可见Github:vue-form-param-check 首先关于自定义指令的介绍可以参考官网。 首先,在github上已经有了一些开
推荐度:
导读vue 使用自定义指令实现表单校验的方法:笔者近期在公司的项目中使用自定义指令完成了表单校验。 这里将思路分享给大家,并写了一个小demo。这个自定义指令还需要大家自行完善。 demo可见Github:vue-form-param-check 首先关于自定义指令的介绍可以参考官网。 首先,在github上已经有了一些开


笔者近期在公司的项目中使用自定义指令完成了表单校验。

这里将思路分享给大家,并写了一个小demo。这个自定义指令还需要大家自行完善。

demo可见Github:vue-form-param-check

首先关于自定义指令的介绍可以参考官网。

首先,在github上已经有了一些开源组件可以支持表单校验。但是对于一些小项目而言,引入一个很大的东西实际上并不好。所以这里利用vue的自定义指令对表单校验进行了简单的实现。

分析

在平时我们所见的表单中,常见的做法有2种:

- input框输入时和提交时,立马进行校验;

- 提交时,统一校验。

针对这2种实现,笔者分别进行了实现。分别如下。

input框输入和提交时,进行校验

import Vue from 'vue'

const IP_REGEX = '^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$'

// 注册一个全局自定义指令 `v-checkParam`
Vue.directive('checkParam', {
 // 当被绑定的元素插入到 DOM 中时……
 inserted: function (el, binding, vNode) {
 el.addEventListener('keyup', function (event) {
 // 首先去除已有样式
 el.className = el.className.replace('input-error', '').trim()
 // if (!event.keyCode) { // 加上这个判断就是在提交时,才会校验
 // 判断是否是否必填
 let isRequired = binding.value.required
 if (isRequired) {
 if (!el.value || el.value === '') {
 el.className += ' input-error'
 }
 }

 // 判断正则
 // debugger
 let regex = binding.value.regex
 if (regex === 'IpRegex') {
 if (!el.value.match(IP_REGEX)) {
 el.className += ' input-error'
 }
 } else if (!el.value.match(regex)) {
 el.className += ' input-error'
 }
 // }
 })
 }
})

// 注册一个全局自定义指令 `v-checkSubmit`
Vue.directive('checkSubmit', {
 // 当被绑定的元素插入到 DOM 中时……
 inserted: function (el, binding, vNode) {
 el.addEventListener('click', function (event) {
 let elements = document.getElementsByClassName('v-check')
 var evObj = document.createEvent('Event')
 evObj.initEvent('keyup', true, true)
 for (let element of elements) {
 element.dispatchEvent(evObj)
 }
 let errorInputs = document.getElementsByClassName('input-error');
 if(errorInputs.length === 0){
 vNode.context.submit();
 }
 })
 }
})

提交时,再统一校验

import Vue from 'vue'

const IP_REGEX = '^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\.' +
'(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$'

// 注册一个全局自定义指令 `v-checkParam`
Vue.directive('checkParam', {
 // 当被绑定的元素插入到 DOM 中时……
 inserted: function (el, binding, vNode) {
 el.addEventListener('keyup', function (event) {
 // 首先去除已有样式
 el.className = el.className.replace('input-error', '').trim()
 if (!event.keyCode) { // 加上这个判断就是在提交时,才会校验
 // 判断是否是否必填
 let isRequired = binding.value.required
 if (isRequired) {
 if (!el.value || el.value === '') {
 el.className += ' input-error'
 }
 }

 // 判断正则
 let regex = binding.value.regex
 if (regex === 'IpRegex') {
 if (!el.value.match(IP_REGEX)) {
 el.className += ' input-error'
 }
 }
 else if (!el.value.match(regex)) {
 el.className += ' input-error'
 }
 }
 })
 }
})

// 注册一个全局自定义指令 `v-checkSubmit`
Vue.directive('checkSubmit', {
 // 当被绑定的元素插入到 DOM 中时……
 inserted: function (el, binding, vNode) {
 el.addEventListener('click', function (event) {
 let elements = document.getElementsByClassName('v-check')
 var evObj = document.createEvent('Event')
 evObj.initEvent('keyup', true, true)
 for (let element of elements) {
 element.dispatchEvent(evObj)
 }
 let errorInputs = document.getElementsByClassName('input-error');
 if(errorInputs.length === 0){
 vNode.context.submit();
 }
 })
 }
})

区别

其实大家很容易发现,上面的2种实现只有一个if的区别,这个的含义是:由提交按钮触发的keyup,是没有keycode的,所以在if(!event.keyCode)满足时,进行校验(也就是在仅提交时,进行校验)。

用法说明

下面给出用例。

<template>
 <div>
 <div>
 <label class="star">Name:</label>
 <input class='v-check' v-checkParam="{required:true,regex:'^[abcde]*$'}" type="text">
 </div>
 <div>
 <label class="star">IP:</label>
 <input class='v-check' v-checkParam="{required:true,regex:'IpRegex'}"
 type="text">
 </div>
 <div>
 <button v-checkSubmit>提交</button>
 </div>
 </div>
</template>
<script>
export default {
 name: 'demo',
 methods: {
 submit () {
 alert('通过校验')
 }
 }
}
</script>

<style scoped>
input{
 height: 22px;
}
.input-error{
 background-color: red;
}
.star:before
{
 content:"*";
 color:red;
}
</style>

所有绑定了class=”v-check”的input,都会在v-checkSubmit被click时进行校验,而其校验规则是v-checkParam对应的规则。

全部校验通过后,会回调到submit方法。进行触发接下来的事务。

效果截图

以上这篇vue 使用自定义指令实现表单校验的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

文档

vue 使用自定义指令实现表单校验的方法

vue 使用自定义指令实现表单校验的方法:笔者近期在公司的项目中使用自定义指令完成了表单校验。 这里将思路分享给大家,并写了一个小demo。这个自定义指令还需要大家自行完善。 demo可见Github:vue-form-param-check 首先关于自定义指令的介绍可以参考官网。 首先,在github上已经有了一些开
推荐度:
标签: 验证 VUE 表单的
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top