【Element】Vue+Element表单校验详解

news2024/11/16 17:54:28

Element表单校验

作为一个后端开发,总结一下实际工作中表单校验的场景和用法。
Element官网:https://element.eleme.cn/#/zh-CN/component/form
代码地址:https://gitee.com/kkmy/kw-microservices/tree/master/kw-ui/kwsphere

常用表单校验场景

  • 表单基本校验(长度、非空、数字类型)
  • 嵌套对象校验 (字段较多,存在嵌套对象,使用同一个el-form)
  • 字段联动校验 (审核场景,同意则审核意见置为非必输)
  • 自定义校验函数 (数字类型的长度校验,身份满18岁校验)
  • 重置表单、校验指定表单、校验指定字段(element表单常用方法)
  • 动态列表表单(添加多条配置、配置)
  • 文件校验 (element)
  • 父子组件校验

场景使用Demo

表单基本校验

在这里插入图片描述

<template>
  <div class="container">
    <div class="center-container">
      <el-form :model="userForm" :rules="rules" ref="userForm" label-width="100px"
               class="demo-userForm">
        <el-form-item label="姓名" prop="name">
          <el-input v-model="userForm.name"></el-input>
        </el-form-item>
        <el-form-item label="性别" prop="gender">
          <el-radio-group v-model="userForm.gender">
            <el-radio label=""></el-radio>
            <el-radio label=""></el-radio>
          </el-radio-group>
        </el-form-item>
        <!--中国行政区划代码:https://www.mca.gov.cn/n156/n186/c110746/content.html-->
        <el-form-item label="籍贯" prop="nativePlace">
          <el-select v-model="userForm.nativePlace" placeholder="请选择性别">
            <el-option value="110000" label="北京市"></el-option>
            <el-option value="120000" label="天津市"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="管理员" prop="admin">
          <el-switch v-model="userForm.admin"></el-switch>
        </el-form-item>
        <el-form-item label="爱好" prop="hobby">
          <el-checkbox-group v-model="userForm.hobby">
            <el-checkbox label="骑行" name="hobby"></el-checkbox>
            <el-checkbox label="跑步" name="hobby"></el-checkbox>
            <el-checkbox label="网游" name="hobby"></el-checkbox>
            <el-checkbox label="旅行" name="hobby"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>

        <el-form-item label="个性签名" prop="desc">
          <el-input type="textarea" v-model="userForm.desc"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm('userForm')">保 存</el-button>
          <el-button @click="resetForm('userForm')">重 置</el-button>
        </el-form-item>
      </el-form>
    </div>

    <el-dialog
      title="提示"
      :visible.sync="centerDialogVisible"
      width="30%"
      @close="closeDialog"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      center>
      <span><pre>{{userForm}}</pre></span>
      <span slot="footer" class="dialog-footer">
    <el-button @click="centerDialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
  </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: "validate-01",
  data() {
    return {
      userForm: {
        name: '',
        nativePlace: '',
        admin: false,
        hobby: [],
        gender: '',
        desc: ''
      },
      rules: {
        name: [
          {required: true, message: '请输入姓名', trigger: ['blur', 'change']},
          {min: 2, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        nativePlace: [
          {required: true, message: '请选择籍贯', trigger: 'blur'}
        ],
        hobby: [
          {type: 'array', required: true, message: '请至少选择一个爱好', trigger: 'change'},
          {type: 'array', min: 2, message: '请至少选择2个爱好', trigger: 'change'},
        ],
        gender: [
          {required: true, message: '请选择性别', trigger: 'change'}
        ],
        desc: [
          {required: true, message: '请填写个性签名', trigger: 'blur'},
          {max: 200, message: '个性签名长度不能大于200', trigger: 'blur'},
        ]
      },

      centerDialogVisible: false,
    };
  },
  methods: {
    closeDialog() {
      this.centerDialogVisible = false;
      this.$refs.userForm.resetFields();
    },
    submitForm(formName) {
      this.$refs.userForm.validate((valid) => {
        if (valid) {
          this.centerDialogVisible = true;
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    resetForm(formName) {
      //this.$refs[formName].resetFields();
      this.$refs.userForm.resetFields();
    }
  }
}
</script>

<style scoped>
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh; /* 设置父容器的高度为视口高度,使其充满整个屏幕 */
}

.center-container {
  max-width: 600px; /* 设置内部容器的最大宽度,根据需求进行调整 */
}
</style>

嵌套对象校验

在这里插入图片描述
在这里插入图片描述

<template>
  <div class="container">
    <div class="center-container">
      <el-form :model="userForm" :rules="rules" ref="userForm" label-width="100px"
               class="demo-userForm">
        <span>基本信息:</span>
        <br>
        <el-form-item label="姓名" prop="name">
          <el-input v-model="userForm.name"></el-input>
        </el-form-item>
        <el-form-item label="性别" prop="gender">
          <el-radio-group v-model="userForm.gender">
            <el-radio label=""></el-radio>
            <el-radio label=""></el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="籍贯" prop="nativePlace">
          <el-select v-model="userForm.nativePlace" placeholder="请选择性别">
            <el-option value="110000" label="北京市"></el-option>
            <el-option value="120000" label="天津市"></el-option>
          </el-select>
        </el-form-item>

        <span>联系方式:</span>
        <br>
        <el-form-item label="QQ" prop="contactDetails.qq">
          <el-input v-model="userForm.contactDetails.qq"></el-input>
        </el-form-item>
        <el-form-item label="微信" prop="contactDetails.wx">
          <el-input v-model="userForm.contactDetails.wx"></el-input>
        </el-form-item>
        <el-form-item label="手机号" prop="contactDetails.phone">
          <el-input v-model="userForm.contactDetails.phone"></el-input>
        </el-form-item>

        <el-form-item>
          <el-button type="primary" @click="submitForm('userForm')">保 存</el-button>
          <el-button @click="resetForm('userForm')">重 置</el-button>
        </el-form-item>
      </el-form>
    </div>

    <el-dialog
      title="提示"
      :visible.sync="centerDialogVisible"
      width="30%"
      @close="closeDialog"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      center>
      <span><pre>{{ userForm }}</pre></span>
      <span slot="footer" class="dialog-footer">
    <el-button @click="centerDialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
  </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: "validate-01",
  data() {
    return {
      userForm: {
        name: '',
        nativePlace: '',
        gender: '',
        contactDetails: {
          qq: '',
          wx: '',
          phone: ''
        }
      },
      rules: {
        name: [
          {required: true, message: '请输入姓名', trigger: ['blur', 'change']},
          {min: 2, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        nativePlace: [
          {required: true, message: '请选择籍贯', trigger: 'blur'}
        ],
        gender: [
          {required: true, message: '请选择籍贯', trigger: 'change'}
        ],
        'contactDetails.qq': [
          {required: true, message: '请输入联系方式qq', trigger: ['blur', 'change']},
        ],
        'contactDetails.wx': [
          {required: true, message: '请输入联系方式微信', trigger: ['blur', 'change']},
        ],
        'contactDetails.phone': [
          {required: true, message: '请输入联系方式手机号', trigger: ['blur', 'change']},
        ],
      },

      centerDialogVisible: false,
    };
  },
  methods: {
    closeDialog() {
      this.centerDialogVisible = false;
      this.$refs.userForm.resetFields();
    },
    submitForm(formName) {
      this.$refs.userForm.validate((valid) => {
        if (valid) {
          this.centerDialogVisible = true;
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    resetForm(formName) {
      //this.$refs[formName].resetFields();
      this.$refs.userForm.resetFields();
    }
  }
}
</script>

<style scoped>
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh; /* 设置父容器的高度为视口高度,使其充满整个屏幕 */
}

.center-container {
  max-width: 600px; /* 设置内部容器的最大宽度,根据需求进行调整 */
}
</style>

字段联动校验

在这里插入图片描述

<template>
  <div class="container">
    <div class="center-container">
      <el-form :model="userForm" :rules="rules" ref="userForm" label-width="100px"
               class="demo-userForm">
        <el-form-item label="审核结果" prop="result">
          <el-radio-group v-model="userForm.result" @change="clearValidate">
            <el-radio-button label="1">通过</el-radio-button>
            <el-radio-button label="0">不通过</el-radio-button>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="审核意见" prop="desc"
                      :rules=
                        "[
                          {required: userForm.result!=1, message: '请填写审核意见', trigger: 'blur'},
          {max: 200, message: '审核意见长度不能大于200', trigger: 'blur'}
                        ]">
          <el-input type="textarea" v-model="userForm.desc"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitForm('userForm')">保 存</el-button>
          <el-button @click="resetForm('userForm')">重 置</el-button>
        </el-form-item>
      </el-form>
    </div>

    <el-dialog
      title="提示"
      :visible.sync="centerDialogVisible"
      width="30%"
      @close="closeDialog"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      center>
      <span><pre>{{ userForm }}</pre></span>
      <span slot="footer" class="dialog-footer">
    <el-button @click="centerDialogVisible = false">取 消</el-button>
    <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
  </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: "validate-01",
  data() {
    return {
      userForm: {
        result: '1',
        desc: ''
      },
      rules: {
        result: [
          {required: true, message: '请选择审核结果', trigger: 'change'}
        ],
      },
      centerDialogVisible: false,
    };
  },
  methods: {
    closeDialog() {
      this.centerDialogVisible = false;
      this.$refs.userForm.resetFields();
    },
    clearValidate(val) {
      if (val == 1) {
        this.$refs.userForm.clearValidate('desc')
      }
    },
    submitForm(formName) {
      this.$refs.userForm.validate((valid) => {
        if (valid) {
          this.centerDialogVisible = true;
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    resetForm(formName) {
      //this.$refs[formName].resetFields();
      this.$refs.userForm.resetFields();
    }
  }
}
</script>

<style scoped>
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh; /* 设置父容器的高度为视口高度,使其充满整个屏幕 */
}

.center-container {
  max-width: 600px; /* 设置内部容器的最大宽度,根据需求进行调整 */
}
</style>

自定义校验函数

动态列表表单

文件校验

父子组件校验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972861.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序中如何查看会员的余额和变更记录

​通过查看会员的余额和变更记录&#xff0c;可以帮助商家更好地管理会员资金&#xff0c;提供更好的服务和用户体验。下面将介绍小程序中如何查看会员的余额以及余额的变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看余额和记录的会员…

【系统设计系列】 回顾可扩展性

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…

猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

volatile+SIGCHLD信号+可重入函数(了解)

索引 volatile1.gcc -O含义及其作用2.证明其内存可见性 深入理解SIGCHLD信号SIGCHLD总结 可重入函数 volatile 保存内存的可见性&#xff0c;告知编译器&#xff0c;该关键字修饰的变量不允许被优化&#xff0c;对该变量的任何操作都必须在内存中操作。 1.gcc -O含义及其作用…

JVM垃圾回收机制和常用算法(简洁版)

垃圾收集 (Garbage Collection,GC) 垃圾收集主要是针对堆和方法区进行。程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的&#xff0c;只存在于线程的生命周期内&#xff0c;线程结束之后就会消失&#xff0c;因此不需要对这三个区域进行垃圾回收。 判断一个对象是…

QTday5作业

Tcp服务器 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); //此时就创建了一个服务器}Widg…

Android数据结构和算法总结-字符串相关高频面试题算法

前言 周末闲来无事&#xff0c;在七月在线上看了看字符串相关算法的讲解视频&#xff0c;收货颇丰&#xff0c;跟着视频讲解简单做了一下笔记&#xff0c;方便以后翻阅复习同时也很乐意分享给大家。什么字符串在算法中有多重要之类的大路边上的客套话就不多说了&#xff0c;直…

linux删除了业务进程正在使用的文件,又不能停止进程,如何释放文件占用的磁盘空间

一台linux分区使用率告警&#xff0c;同事为了清理空间&#xff0c;通过du -sh *查到应用的日志文件占用很高&#xff0c;他直接rm删除了日志文件。但df -h看分区空间并没有释放。 执行lsof | grep delete可以看到刚刚删除的文件因为被正在运行的进程调用所以并没有释放磁盘空间…

优维产品最佳实践:如何设计流水线?

前言&#xff1a;我们上期介绍了什么是CI以及CI的重要性&#xff0c;本期目标就是学习如何设计流水线&#xff0c;流水线是一种用于自动化软件开发和部署的工具链&#xff0c;它可以将软件开发过程中的各个步骤组织成一个连续的流程&#xff0c;从而提高开发效率和软件质量。在…

安装虚拟机+安装/删除镜像

安装虚拟机 注意&#xff0c;官网可能无法登录&#xff0c;导致无法从官网下载&#xff0c;就自己去网上搜靠谱的下载&#xff0c;我用的16.2.3 删除镜像 Vm虚拟机怎么删除已经创建的系统&#xff1f;Vm虚拟机创建好之后iso删除方法 - 系统之家 (xitongzhijia.net) 安装镜像…

Python中内建模块和标准库的工作原理? - 易智编译EaseEditing

Python中的内建模块和标准库是Python编程语言的一部分&#xff0c;它们提供了大量的功能和工具&#xff0c;可用于各种任务和应用程序。这些模块和库通常是由Python官方维护的&#xff0c;因此在任何标准Python安装中都是可用的。 以下是内建模块和标准库的工作原理的概述&…

数据结构——单调队列

单调队列 单调队列的概念和操作过程 概念&#xff1a; 单调队列和单调栈在操作上有相似之处&#xff0c;但因为单调队列是队列&#xff0c;所以多了一项特殊操作&#xff0c;即头部的元素可以出队&#xff0c;相当于滑动窗口向后滑动。这头部的出队操作就相当于淘汰&#xff0c…

需求管理做不好,项目成功难保障

你是否曾感觉客户的要求总是突然冒出来&#xff1f;或是觉得自己跟不上订单的节奏&#xff1f;不了解产品的需求会让你手忙脚乱&#xff0c;如果没有足够的资源来应对&#xff0c;甚至会损害你的业务。 本文将向你介绍需求管理的流程&#xff0c;以及如何在业务中使用它。 项目…

【洛谷算法题】P5703-苹果采购【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5703-苹果采购【入门1顺序结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

BCSP-玄子Share-Java框基础_反射

一、反射 1.1 反射介绍 Java反射&#xff1a;在编译时不确定哪个类被加载&#xff0c;而在程序运行时才加载、探知、使用 1.1.1 Java 程序的运行过程 1.1.2 反射及其作用 反射是指能够在运行时&#xff0c;观察并修改自己运行时(Runtime)行为的特性 Java 反射机制主要提供了…

verilog语法之case casez casex

在rtl仿真中&#xff0c;有四种状态&#xff0c;分别是0、1、x&#xff08;unknown values&#xff09;和z&#xff08;high-impedance values&#xff09;。 case 结构体中&#xff1a;0&#xff0c;1&#xff0c;X与Z是四种不同的状态&#xff0c;case条件比较时会检测比较双…

2023年03月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;走出迷宫 当你站在一个迷宫里的时候&#xff0c;往往会被错综复杂的道路弄得失去方向感&#xff0c;如果你能得到迷宫地图&#xff0c;事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸&a…

BCSP-玄子Share-Java框基础_工厂模式/代理模式

三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…

【管理运筹学】第 7 章 | 图与网络分析(2,最小支撑树问题)

文章目录 引言二、最小支撑树问题2.1 树的定义及其基本性质2.2 图的支撑树2.3 最小支撑树的定义及有关定理2.4 最小支撑树算法2.4.1 避圈法&#xff08;KRUSKAL算法&#xff09;2.4.2 反圈法&#xff08;PRIM算法&#xff09;2.4.3 破圈法 写在最后 引言 承接前文&#xff0c;…

宠物电商Chewy第二季度销售额28亿美元,同比增长14.3%

美国宠物电商Chewy公布2023年第二季度财报。报告显示&#xff0c;其Q2季度销售额同比增长14.3%至28亿美元&#xff0c;超出市场预期。 以下为Chewy期内业绩概要&#xff1a; 1.毛利率28.3%&#xff0c;同比增长20个基点 2.净利润有所收窄&#xff0c;同比下降15.2%至1890万美…