vue 表单校验(二)

时间:2022-05-04 09:27:58

vue 表单校验(二)

vue element-ui表单校验

由于现在使用element-ui进行form表单校验,因而使用其自带的校验规则进行校验,发现有些并不是那么好校验,或者说是校验起来很繁琐,因而一直在研究中

表单校验分类

前后端校验

  • 前端校验
  • 后端校验

    这种目前一般是结合起来使用,很少单纯前端校验,或者单纯后端校验的

前端检验

  • 数据录入时校验
  • 数据回显时校验
  • 动态创建时校验
  • 数据是否必填时校验

接下来所谈论的校验都是基于前端进行校验,若是后天校验,只是统一校验规则而已,这样前后便可以统一了。其实这里并不是很简单,但是不得不细心,而已最好,前后台都要其校验规则,以及校验话术放在一个公共的地方,避免在每个具体文件内进行修改。若是能更好的话,类似 google email 那样,通过后台返回规则类型,以及对应前台的具体编号,进行显示即可(比如1: 不能为空, 2:校验规则不合...) 这样的好处,前台只认这个数字即可,不然后台返回什么,前台出什么错误,都是统一显示(这个扯远了),讲今天的重点

基于 element-ui 自带的 表单校验

  • 数据录入时校验

    vue 表单校验(二)

element-ui form validate

  • el-form 标签
    • 属性
      • model 对象却只能是一维 { a: 1, b: 2 }, 不能是 { a: { b: 2 } }, 不然关联不到
      • rules 按照规则要求即可
      • ref 提交表单时触发
  • el-form-item 标签 必须使用这个进行包裹 表单框... 校验才会有效
    • 属性
      • prop 只有标识了这个才会进入校验
<template>
<el-form
:model="ruleForm"
ref="ruleForm"
label-width="100px"
:rules="rules">
<el-form-item
label="活动名称"
prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="submitForm('ruleForm')">立即创建</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</template> <script>
...
data () {
const isNum = (rule, value, callback) => { // 参数顺序必须如
let reg = /^[0-9]{5,20}$/;
if (reg.test(value)) {
callback()
} else {
callback(new Error("不是数据"))
}
} return {
ruleForm: {
name: ''
},
rules: {
name: [
{
required: true, // 用来设置是否必填
message: '不能为空', // 错误信息展示
trigger: 'blur' // 触发校验事件
},
{
min: 3,
max: 5,
message: '长度在 3 到 5 个字符',
trigger: 'blur'
},
{
validator: isNum, // 自定义校验
trigger: ['blur', 'change'] // 填写 blur change时,可以达到类似 input事件,实时进行校验
}
]
}
}
},
methods: {
/**
* 表单提交
*/
submitFomr (formName) {
this.$refs[formName].validate(valid => {
if (valid) {
alert('success')
} else {
alert('error')
}
})
},
/**
* 重置表单
*/
resetForm (formName) {
this.$refs[formName].resetFields()
}
}
</script>

以上是一个正常表单的大致模型

  • 数据回显时校验

    vue 表单校验(二)

主要是数据返回时,要不要触发校验

  • 不触发 github 这里有一些解释,不是很好弄
  • 触发 (跟产品沟通过,倾向于这种)

    当前基于数据反显时就触发校验
setFormData () {
setTimeout(() => {
this.ruleForm = {
name: '测试项目',
region: 2,
type: [1, 2],
resource: 1,
desc: '测试数据回显时校验颜色变化问题'
} this.$nextTick(() => {
// 为了回显时,不只是el-select 校验被触发
this.$refs.ruleForm.validate()
})
}, 1500)
  • 动态创建时校验

有时候需要动态创建一个输入框时,也需要检验,这时候就需要动态校验,不然一直卡着过不去

vue 表单校验(二)

<el-row
class="sc-row"
:gutter="20"
v-for="(t, i) in ruleForm.contactList"
:key="t.id">
<!-- :key="i" 没问题; :key="t.id" 时,不会变亮 ==== 没必要在第一次赋值时给id,新增时再给即可-->
<el-col :span="8">
<el-form-item
label="姓氏"
:prop="'contactList.' + i +'.family_name'"
:rules="[
{ required: true, message: '不能为空', trigger: ['blur', 'change']}
]">
<el-input v-model="t.family_name"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
label="名字"
:prop="'contactList.' + i +'.contact_name'"
:rules="[
{required: true, message: '不能为空', trigger: ['blur', 'change']}
]">
<el-input v-model="t.contact_name"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-button @click.prevent="deleteConcats(t)">删除</el-button>
</el-col>
</el-row>

重点,切记切记

  • 循环 v-for == v-for = '(item, i) in list' :key="item.id" i

  • el-form-item 属性

    • :prop = "contactList.${i}.contact_name "
    • :rules="[{{required: true, message: '不能为空', trigger: ['blur', 'change']}]" 写相应的校验规则
  • 删除已添加的表单

    • v-for 绑定时,:key="item.id" 使用对应值的id,而不是对应的索引i
    addConcats () {
    this.ruleForm.contactList.push({
    family_name: '',
    contact_name: '',
    id: Date.now() // 还是需要使用,这样可以 避免校验触发时,删除后却没有变化
    })
    },
    deleteConcats (item) {
    const List = this.ruleForm.contactList
    const index = List.findIndex((val) => {
    return item === val
    })
    List.splice(index, 1)
    }
    }
  • 数据是否必填时校验

    vue 表单校验(二)

<el-form-item
label="是不是必填"
prop="isRequire"
:rules="[
{required: isRequire, message: '请填写', trigger: 'blur'}
]">
<el-input v-model="ruleForm.isRequire"></el-input>
</el-form-item>

是否选填,个人建议直接以动态form表单形式进行展示,这样便可以通过 { reuired: isRequire }isRequire Boolean类型

总结

至此,大致的form表单校验就差不多了,虽然看起来很简单,但是也是我不断采坑过来的,在此,我更加推荐使用 element-ui-verify,里面有详细的文档,多多关注即可

  • 当前校验的缺点
    • 动态创建
    <el-row class="sc-row" :gutter="20" v-for="(t, i) in ruleForm.contactList" :key="t.id">
    <el-col :span="8">
    <el-form-item
    label="姓氏"
    :prop="'contactList.' + i +'.family_name'"
    :rules="[
    { required: true, message: '不能为空', trigger: ['blur', 'change']}
    ]">
    <el-input v-model="t.family_name"></el-input>
    </el-form-item>
    </el-col>
    <el-col :span="8">
    <el-form-item
    label="名字"
    :prop="'contactList.' + i +'.contact_name'"
    :rules="[
    {required: true, message: '不能为空', trigger: ['blur', 'change']}
    ]">
    <el-input v-model="t.contact_name"></el-input>
    </el-form-item>
    </el-col>
    <el-col :span="8">
    <el-button @click.prevent="deleteConcats(t)">删除</el-button>
    </el-col>
    </el-row>

    上面的 姓氏和名字 同为中文或英文时,很难进行判断 element密码两次是否相同,但是当前动态创建时,无法传递索引,自定义方法中无法进行传参,导致拿不到同一索引下的姓氏跟名字,也就无法进行匹配判断了

  • 其他注意细节
    • 在自定义验证里面每一个判断都要有callback(),就是要保证callback()一定会执行到,不然既不报错,也不提交代码,令人很是无语
    • async-validator
    • 上面例子的code

到此,算是一个给自己年末去心病吧,这个困惑我太久了,到现在想想都恐怖,算是简单补充下吧,后期再多多注意

在此抛出几个问题,留给自己思考

  • 大型表单时,哪儿错误,自动定位到哪儿,同时 focus
  • 统一错误信息,后台传给前台具体id,以供前台进行错误信息展示,这个前台统一管理
  • 考虑使用其他校验插件,多多扩充自己的脑容量

vue 表单校验(二)的更多相关文章

  1. vue表单校验(三)

    vue表单校验(三) 每当看到heyui的这个表单校验,我就一直想将element的校验也做类似的功能,终于有了方式,虽然不是很完美,但是可以使用,能满足要求了 实现方式 基于element-ui实现 ...

  2. vue 表单校验报错 &quot&semi;Error&colon; please transfer a valid prop path to form item&excl;&quot&semi;

    vue 表单校验报错 "Error: please transfer a valid prop path to form item!" 原因:prop的内容和rules中定义的名称 ...

  3. vue 表单校验 一

    表单校验 一 最近使用elment-ui表单进行各种校验,心力交瘁,依旧不能很好地解决,先列出自己的归类,后期一个个攻破 表单校验史 表单校验准则 参考资源 1 2 3 4 5 第一种 显示明确的错误 ...

  4. Vue 表单校验 vee-validate

    gitHub 地址:https://github.com/baianat/vee-validate 官网API 地址:https://baianat.github.io/vee-validate/ap ...

  5. vue表单校验提交报错TypeError&colon; Cannot read property &&num;39&semi;validate&&num;39&semi; of undefined

    TypeError: Cannot read property 'validate' of undefined at VueComponent.submitForm (plat_users.html: ...

  6. 应用二:Vue之ElementUI Form表单校验

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的)   表单校验是前端开发过程中最常用到的功能之一,根据个人的工作经验总结在此对表单校验功能的基 ...

  7. vue&period;js基础知识篇&lpar;7&rpar;&colon;表单校验详解

    目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vue=require("vue&quo ...

  8. Vue&period;js &plus; Nuxt&period;js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  9. Vue&period;js表单校验;动画指令;避免内存泄露。

    Vue.js表单校验: 动画指令:创建自定义的滚动指令. 避免内存泄露. 避免内存泄露 在单页面应用开发时SPA,用户无需刷新浏览器.所以javascript应用需要自行清理组件来防止内存占用不断增长 ...

随机推荐

  1. 读书笔记--SQL必知必会01--了解SQL

    1.1 数据库基础 数据库(datebase) 保存有组织的数据的容器(通常是一个文件或一组文件),是一个以某种有组织的方式存储的数据集合. 数据库管理系统(DBMS,Data Base Manage ...

  2. 前端学PHP之命名空间

    × 目录 [1]定义 [2]多命名空间 [3]名称解析[4]访问内部元素[5]全局空间[6]别名和导入 前面的话 从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在 ...

  3. Thinkphp url 除去index&period;php

    例如你的原路径是 http://localhost/test/index.php/index/add那么现在的地址是 http://localhost/test/index/add如何去掉index. ...

  4. sqlserver OpenRowSet 对应的三种数据库驱动

    在使用sqlserver数据库的OpenRowSet函数时,会遇到三种驱动方式: 1. MSDASQL驱动SELECT TOP 10 * FROM OPENROWSET('MSDASQL', 'DRI ...

  5. top 介绍

    本文转自:http://www.2cto.com/os/201209/157960.html,感谢作者的辛勤付出! top命令经常用来监控linux的系统状况,比如cpu.内存的使用,程序员基本都知道 ...

  6. php实现显示网站运行时间-秒转换年月日时分秒

    <?php // 设置时区 date_default_timezone_set('Asia/Shanghai'); /** * 秒转时间,格式 年 月 日 时 分 秒 * * @author w ...

  7. php Smarty模板引擎配置与测试

    Smarty简介 smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页 ...

  8. iOS设备per app vpn,什么是什么系统的要求,必须?

    坑爹Apple网站信息MDM厂商资料,最有发言权iOS 7.x设备支持per app vpn该,但它没有说明是什么系统要求环保要求. 1. iOS 7.x 设备.当然 2. iOS 7.x 需要设备M ...

  9. 查看网卡及对应的IP、MAC

    #!/bin/bash# judge OS OS_release=`cat /etc/redhat-release | awk '{print $(NF-1)}'|cut -c 1`# To obta ...

  10. 获取搜索结果的真实URL、描述、标题

    1.场景 爬虫练手代码 2.代码 Python2: #!/usr/bin/python # -*- coding:utf-8 -*- import requests from lxml import ...