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 判断checkbox是否选中的操作方法
Nov 09 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
原生javascript实现图片按钮切换
Jan 12 Javascript
Linux下编译安装php libevent扩展实例
Feb 14 Javascript
基于JS实现的倒计时程序实例
Jul 24 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
基于原生js淡入淡出函数封装(兼容IE)
Oct 20 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
Dec 06 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
教你一步步实现一个简易promise
Nov 02 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操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php zip文件解压类代码
2009/12/02 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
js代码实现微博导航栏
2015/07/30 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
php实现购物车功能(下)
2016/01/05 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
js字符串转成JSON
2013/11/07 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python、Javascript中的闭包比较
2015/02/04 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python 字符串和整数的转换方法
2018/06/25 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
中药专业自荐信范文
2014/03/18 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python