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防止表单重复提交实现代码
Sep 05 Javascript
使用js操作css实现js改变背景图片示例
Mar 10 Javascript
上传文件返回的json数据会被提示下载问题解决方案
Dec 03 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
Jul 27 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
vue 1.0 结合animate.css定义动画效果
Jul 11 Javascript
js实现内置计时器
Dec 16 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 Javascript
vue 项目@change多个参数传值多个事件的操作
Jan 29 Vue.js
探索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 安全检测代码片段(分享)
2013/07/05 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
常用的javascript function代码
2008/05/23 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
详解python字节码
2018/02/07 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
使用Python进行目录的对比方法
2018/11/01 Python
Python3 批量扫描端口的例子
2019/07/25 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
Django 路由层URLconf的实现
2019/12/30 Python
Python读取yaml文件的详细教程
2020/07/21 Python
管理心得体会
2013/12/28 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
优质服务演讲稿
2014/05/14 职场文书
企业诚信承诺书
2014/05/23 职场文书
学校火灾防控方案
2014/06/09 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
健康状况证明书
2014/11/26 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
会计工作检讨书
2015/02/19 职场文书
2015年领班工作总结
2015/04/29 职场文书
运动会100米加油稿
2015/07/21 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
Python+Appium新手教程
2021/04/17 Python
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Python序列化模块JSON与Pickle
2022/06/05 Python