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面向对象、prototype、call()、apply()
May 14 Javascript
用jQuery扩展自写的 UI导航
Jan 13 Javascript
Node.js中对通用模块的封装方法
Jun 06 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
Mar 01 Javascript
JS代码实现table数据分页效果
May 26 Javascript
Bootstrap轮播插件简单使用方法介绍
Jun 21 Javascript
bootstrap手风琴制作方法详解
Jan 11 Javascript
关于使用axios的一些心得技巧分享
Jul 02 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
vue2 中二级路由高亮问题及配置方法
Jun 10 Javascript
js实现简单抽奖功能
Nov 24 Javascript
JS如何实现基于websocket的多端桥接平台
May 14 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防止用户重复提交表单
2015/11/02 PHP
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
js实现抽奖功能
2020/11/24 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现ip查询示例
2014/03/26 Python
python交互式图形编程实例(一)
2017/11/17 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
如何利用python进行时间序列分析
2020/08/04 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
HTML5边玩边学(1)画布实现方法
2010/09/21 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
英国最大的海报商店:GB Posters
2018/03/20 全球购物
工伤赔偿协议书
2014/04/15 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
亮剑精神观后感
2015/06/05 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
校运会宣传稿大全
2015/07/23 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
golang switch语句的灵活写法介绍
2021/05/06 Golang
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android