Vue自定义表单内容检查rules实例


Posted in Javascript onOctober 30, 2020

先看个例子

组件

<el-form-item label="手机号:" prop="phone_number">
 <el-input v-model="formPerson.phone_number"></el-input>
</el-form-item>

script中

export default {
 data() {
  var validateMobilePhone = (rule, value, callback) => {
   if (value === '') {
    callback(new Error('负责人手机号不可为空'));
   } else {
    if (value !== '') {
    var reg = /^1[3456789]\d{9}$/;
    if (!reg.test(value)) {
     callback(new Error('请输入有效的手机号码'));
    } else {
     callback();
    }
    }
   }
  };
 
  return{
   formPerson: {
    phone_number: '',
   },
   rules: {
    phone_number: [
    {validator: validateMobilePhone, trigger: 'blur'}
    ]
   },
  }
 }
}

遇到的坑

在组件中【开始写的时候prop自定的名字】

<el-form-item label="手机号:" prop="phone">
 <el-input v-model="formPerson.phone_number"></el-input>
</el-form-item>

rules中

rules: {
 phone: [
 {validator: validateMobilePhone, trigger: 'blur'}
 ]
}

碰到的坑

当输入正确的手机号时,显示为错误,发现value并没有传过来,为undefined

解决:

prop写成和数据中的参数的名称一样,即phone_number

补充知识:用vue自定义指令v-validated写一个全局表单验证

由于不想在单vue文件里用blur等等设置表单验证并显示验证失败的信息,因此思考并封装了一个全局自定义指令。

献上我的代码。

html

<div class="form-section">
    <p>First Name</p>
    <input type="text" v-model='form.username' v-validated:username="['username',form.username]" placeholder="" >
    <div class="error"></div>
   </div>
    <div class="form-section">
    <p>Last Name</p>
    <input type="text" v-model='form.secondname' placeholder="">
    <div class="error"></div>
   </div>
   <div class="form-section">
    <p>Email</p>
    <input type="email" v-model='form.email' v-validated:email="['email',form.email]" placeholder="">
    <div class="error"></div>
   </div>
   <div class="form-section">
    <p>Password</p>
    <input type="password" v-model='form.password' v-validated:password="['password',form.password]" autocomplete placeholder="">
    <div class="error"></div>
   </div>

在input上挂载v-validated指令,向指令传输 ‘username'的校验类型,和form.username的校验数据。

现在封装v-validated指令

validated.js

import Vue from 'vue'
/**
 * 校验失败
*/
function testError (el) {
 el.style.borderColor = '#d20000'
 el.style.backgroundColor = '#fff8f8'
}
/**
 * 校验成功
*/
function testCorrect (el) {
 el.style.borderColor = '#a3a3a3'
 el.nextElementSibling.innerHTML = ''
 el.style.backgroundColor = 'transparent'
}
/**
 * 校验用户名
 * */
function testUserName (username, el) {
 if (/^\w{3,30}$/g.test(username)) {
  testCorrect(el)
  return true
 } else {
  testError(el)
  el.nextElementSibling.innerHTML = 'Username must be 3 to 30 characters'
  return false
 }
}
/**
 * 校验邮箱
 * */
function testEmail (email, el) {
 if (/^[\w-]+@[\w-]+(\.[\w-]+)+$/g.test(email)) {
  testCorrect(el)
  return true
 } else {
  testError(el)
  el.nextElementSibling.innerHTML = 'Mailbox format is not correct!'
  return false
 }
}
/**
 * 校验密码
 * */
function testPwd (pwd, el) {
 if (/^\w{6,30}$/g.test(pwd)) {
  testCorrect(el)
  return true
 } else {
  testError(el)
  el.nextElementSibling.innerHTML = 'Password must be 6 to 30 characters'
  return false
 }
}

Vue.directive('validated', {
 inserted (el, binding) { // 绑定元素插入父节点时调用
  el.addEventListener('blur', () => {
   switch (binding.value[0]) {
    case 'username' : testUserName(binding.def[binding.rawName], el); break
    case 'email' : testEmail(binding.def[binding.rawName], el); break
    case 'password' : testPwd(binding.def[binding.rawName], el); break
   }
  })
 },
 update: function (el, binding, vNode) { // 更新元素信息时调用
  binding.def[binding.rawName] = binding.value[1]
 }
})
export default {
 init () {
  console.log('*** validated installed ***')
 }
}

由于没有找到官方钩子之间传递数据的方法,所以自己看着用binding.def下定义updated来作为传递数据,

inserted是节点插入时就调用一次。在这里做元素blur的监听,动态数据由update刷新。

修正:我只定义一个updated会出现多个更新数据共用一个参数名,导致数据错乱。

所以我用binding.rawName做指针,放入binding.def下,实现一个页面多个数据多个处理,因为update钩子是页面上的任意改动都会触发,而不是当前挂载指令的dom对象变化才会跟着变化。

最后将这个文件放入main.js

main.js

import validated from '@/dorajs/validated.js'

Vue.use(validated)

效果如下

Vue自定义表单内容检查rules实例

Vue自定义表单内容检查rules实例

Vue自定义表单内容检查rules实例

完美解决!

以上这篇Vue自定义表单内容检查rules实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
Jun 06 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
Apr 16 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
Vue编写多地区选择组件
Aug 21 Javascript
Vue.set()实现数据动态响应的方法
Feb 07 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
微信小程序地图绘制线段并且测量(实例代码)
Jan 02 Javascript
js 计算月/周的第一天和最后一天代码
Feb 01 Javascript
探索node之事件循环的实现
Oct 30 #Javascript
使用TS来编写express服务器的方法步骤
Oct 29 #Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
Oct 29 #Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 #Javascript
使用jQuery实现购物车
Oct 29 #jQuery
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 #Javascript
react使用antd表单赋值,用于修改弹框的操作
Oct 29 #Javascript
You might like
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
基于文本的访客签到簿
2006/10/09 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
2018/12/11 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
Python中datetime模块参考手册
2017/01/13 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
Python 异常处理的实例详解
2017/09/11 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
自我鉴定怎么写
2013/12/05 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
一年级评语大全
2014/04/23 职场文书
大学活动总结格式
2014/04/29 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
移除Selenium中window.navigator.webdriver值
2022/06/10 Python
win10搭建配置ftp服务器的方法
2022/08/05 Servers