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 相关文章推荐
JavaScript delete操作符应用实例
Jan 13 Javascript
js 函数的执行环境和作用域链的深入解析
Nov 01 Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 Javascript
JS window对象的top、parent、opener含义介绍
Dec 03 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
Mar 27 Javascript
jquery选择符快速提取web表单数据示例
Mar 27 Javascript
JavaScript实现自动变换表格边框颜色
May 08 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
原生JS实现自定义滚动条效果
Oct 27 Javascript
Vue实现点击后文字变色切换方法
Feb 11 Javascript
vue 对axios get pust put delete封装的实例代码
Jan 05 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
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php第一次无法获取cookie问题处理
2014/12/15 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
php命令行模式代码实例详解
2021/02/26 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
jQuery validate 中文API 附validate.js中文api手册
2010/07/31 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
利用python开发app实战的方法
2019/07/09 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
Laura官网:加拿大女性的顶级时尚目的地
2019/09/20 全球购物
公司领导推荐信
2013/11/12 职场文书
教师学期末个人总结
2015/02/13 职场文书
求职自我评价怎么写
2015/03/09 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python