vue实现提交时对不同板块的表单内容进行校验

news2024/11/13 19:13:39

图一

需求

1、需要对第一个红色框框板块内所有带星号的地方进行校验,并将提示语显示到对应的输入框下面,如图:
在这里插入图片描述
2、第二个红色框框板块中,点击 “添加相关人员” 能实现对多人的添加功能,并且能绑定相对应的校验规则
3、在第二个红色框框板块中,对所有红色星号进行指定规则校验,如下图:
在这里插入图片描述

代码

    <!-- 添加或修改出勤信息 -->
    <el-dialog :title="title" :visible.sync="open" width="1300px" append-to-body >
        <el-form ref="form" :model="form" :rules="rules" size="medium" label-width="100px">
          <el-col :span="6">
            <el-form-item label="出行类型" prop="carPlanType" >
              <el-select v-model="form.carPlanType" placeholder="请选择出行类型" :style="{width: '100%'}" @change="changeDataFromPlanType" :disabled="form.id != null">
                <el-option v-for="(item,index) in carPlanTypeData.carPlanTypeOptions" :key="index" :label="item.label"
                  :value="item.label" :disabled="item.disabled"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="18" v-if="form.carPlanType=='非生产出行'">
            <el-form-item label="项目名称" prop="projectName" >
              <el-input v-model="form.projectName" placeholder="请输入项目名称" clearable :style="{width: '100%'}">
              </el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12" v-if="form.carPlanType !='非生产出行'">
            <el-form-item label="项目名称" prop="projectName" >
              <el-select v-model="form.projectName" placeholder="请选择项目名称"  clearable filterable remote :remote-method="getProjectOptions" :loading="projectLoading" @change="changeProjectCode"
                :style="{width: '100%'}">
                <el-option v-for="item in projectOptions" :key="item.projectId" :label="item.projectCode +'-'+ item.projectName +'-'+ item.projectLeader"
                  :value="item" :disabled="item.disabled"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6" v-if="form.carPlanType !='非生产出行'">
            <el-form-item label="项目编号" prop="projectCode" >
              <span style="color: red;">{{ form.projectCode }}</span>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="起码里程" prop="startMileage">
              <el-input-number v-model="form.startMileage" placeholder="起码里程" @change="handleMileageChange" controls-position=right>
              </el-input-number>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="出发日期" prop="setOutDay">
              <el-date-picker v-model="form.setOutDay" format="yyyy-MM-dd" value-format="yyyy-MM-dd" 
                :style="{width: '100%'}" placeholder="请选择出发日期" clearable></el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="司机" prop="driverName">
              <el-select v-model="form.driverName" placeholder="请选择司机" clearable filterable remote :remote-method="getUserOptions" :loading="userLoading" @change="changeDriverNameOptions" :style="{ width: '100%' }">
                <el-option v-for="userOption in userOptions" :key="userOption.userId" :label="userOption.nickName +' - '+ userOption.userName"
                  :value="userOption" :disabled="userOption.disabled"></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="止码里程" prop="endMileage">
              <el-input-number v-model="form.endMileage" placeholder="止码里程" @change="handleMileageChange" controls-position=right>
              </el-input-number>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="出发时间" prop="setOutTime">
              <el-time-picker v-model="form.setOutTime" format="HH:mm" value-format="HH:mm"
                :picker-options='{"selectableRange":"00:00:00-23:59:59"}' :style="{width: '100%'}"
                placeholder="请选择出发时间" clearable></el-time-picker>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="车牌号" prop="licensePlateCode">
              <el-select v-model="form.licensePlateCode" placeholder="请选择车牌号" filterable clearable :style="{ width: '100%' }">
                <el-option v-for="dictData in licensePlateCode.licensePlate" :key="dictData.id" :label="dictData.licensePlateCode"
                  :value="dictData.licensePlateCode" ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="里程数" prop="diffMileage">
              <span style="color: red;">{{ form.diffMileage }}</span>
            </el-form-item>
          </el-col>
          <el-col :span="16">
            <el-form-item label="备注" prop="remarks">
              <el-input v-model="form.remarks" placeholder="请输入备注" clearable :style="{width: '100%'}">
              </el-input>
            </el-form-item>
          </el-col>
          <el-card >
            <div slot="header" class="clearfix">
              <span style="font-size: 15px; color: red; font-weight: bold;">相关人员管理</span>
              <el-button style="float: right; padding: 3px 0" type="text"  @click="addRelatedPeople">添加相关人员</el-button>
            </div>
            <div v-for="(relatedPeople,relatedIndex) in form.relatedPeoples" :key="relatedIndex">
              <el-row :gutter="6">
              <el-form :ref="'relatedPeople'+relatedIndex" :model="relatedPeople"  size="mini"  label-position="top"  height="200px">
                  <el-col :span="3">
                    <el-form-item label="成员" prop="userId" :rules="attend.attendRules.userName">
                      <el-select v-model="relatedPeople.nickName" placeholder="请选择成员" clearable 
                      filterable remote :remote-method="getUserOptions"  :loading="userLoading"  @change="changeUserOptions($event,relatedIndex)" >
                        <el-option v-for="userOption in userOptions" :key="userOption.userId" :label="userOption.nickName +' - '+ userOption.userName"
                          :value="userOption" :disabled="userOption.disabled"></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="计酬模式" prop="allowanceType" :rules="attend.attendRules.allowanceType">
                      <el-select v-model="relatedPeople.allowanceType" placeholder="请选择计酬模式" >
                        <el-option
                          v-for="dict in dict.type.allowance_type"
                          :key="dict.value"
                          :label="dict.label"
                          :value="dict.value"
                        ></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="出勤类型" prop="attendStatus" :rules="attend.attendRules.attendStatus">
                      <el-select v-model="relatedPeople.attendStatus" placeholder="请选择出勤类型" >
                        <el-option v-for="(item,index) in attendStatusOptions" :key="index" :label="item.label"
                          :value="item.value" ></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="出勤时长" prop="isHalfDay" :rules="attend.attendRules.isHalfDay">
                      <el-select v-model="relatedPeople.isHalfDay" placeholder="请选择出勤时长">
                        <el-option v-for="(item,index) in isHalfDayOptions" :key="index" :label="item.label"
                          :value="item.value" :disabled="item.disabled"></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="担任角色" prop="userType" :rules="attend.attendRules.userType">
                      <el-select v-model="relatedPeople.userType" placeholder="请选择担任角色">
                        <el-option v-for="(item,index) in userTypeOptions" :key="index" :label="item.label"
                          :value="item.value" :disabled="item.disabled"></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="车费承担方" prop="carFarePayer" :rules="attend.attendRules.carFarePayer">
                      <el-select v-model="relatedPeople.carFarePayer" placeholder="请选择车费承担方">
                        <el-option
                          v-for="dict in dict.type.car_fare_payer"
                          :key="dict.value"
                          :label="dict.label"
                          :value="dict.value"
                        ></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-form-item label="备注" prop="remarks" :rules="[{required: relatedPeople.allowanceType==2, message: '当计酬模式为出勤津贴时,备注必填', trigger: 'change' }]" v-if="relatedPeople.allowanceType==2">
                      <el-input v-model="relatedPeople.remarks" clearable placeholder="请输入备注"/>
                     </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <el-button type="danger" size="mini" style="margin-top: 38px; margin-left: 10px;" v-if="form.relatedPeoples.length > 1" @click="deleteRelatedPeople(relatedIndex)">删除</el-button>
                  </el-col>
              </el-form>
              </el-row>
            </div>
          </el-card>
        </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>

第一部分表单校验rules

// 表单校验
      rules: {
        carPlanType: [{
          required: true,
          message: '请选择出行类型',
          trigger: 'change'
        }],
        projectName: [{
          required: true,
          message: '请选择项目名称',
          trigger: 'change'
        }],
        startMileage: [{
          required: true,
          message: '起码里程',
          trigger: 'blur'
        }],
        setOutDay: [{
          required: true,
          message: '请选择出发日期',
          trigger: 'change'
        }],
        endMileage: [{
          required: true,
          message: '止码里程',
          trigger: 'blur'
        }],
        setOutTime: [{
          required: true,
          message: '请选择出发时间',
          trigger: 'change'
        }],
        diffMileage: [{
          required: true,
          message: '里程数',
          trigger: 'blur'
        }],
      },

第二部分空闲人员表单校验rules

attend: {
        open: false,
        title: "考勤管理",
        //空闲人员填写规则
        attendRules:{
          userName: [{
            required: true,
            message: '请选择成员',
            trigger: 'change'
          }],
          allowanceType: [{
            required: true,
            message: '请选择计酬模式',
            trigger: 'change'
          }],
          attendStatus: [{
            required: true,
            message: '请选择出勤类型',
            trigger: 'change'
          }],
          isHalfDay: [{
            required: true,
            message: '请选择出勤时长',
            trigger: 'change'
          }],
          userType: [{
            required: true,
            message: '请选择担任角色',
            trigger: 'change'
          }],
          carFarePayer: [{
            required: true,
            message: '请选择车费承担方',
            trigger: 'change'
          }],
          remarks: [{
            required: false,
            message: '当计酬模式为出勤津贴时,备注必填',
            trigger: 'change'
          }],
        },
      },
    };
  },

添加相关人员按钮函数

    // 添加相关人员
    addRelatedPeople(){
      const relatedPeople = {
        "userId":"",
        "userName":"",
        "nickName":"",
        "userType":"",
        "isHalfDay":3,
        "attendStatus":"1",
        "allowanceType":"1",
        "carFarePayer":"",
        "remarks":"",
      };
      this.getUserOptions();
      this.form.relatedPeoples.push(relatedPeople)
    },

提交按钮

/** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          // 对相关人员数据格式进行校验
          let isSave = true;
          let relatedPeoples =this.form.relatedPeoples;
          for(let i =0; i< relatedPeoples.length; i++){
            this.$refs["relatedPeople"+i][0].validate(valid => {
              // 当所有valid==true时,执行保存操作
              if (!valid) {
                isSave = false;
              }
          }) 
          }
          if (isSave) {
            if (this.form.id != null) {
              updateSysCarPlanManage(this.form).then((response) => {
                this.$modal.msgSuccess("修改成功");
                this.open = false;
                this.getList();
              });
            } else {
              addSysCarPlanManage(this.form).then((response) => {
                this.$modal.msgSuccess("新增成功");
                this.open = false;
                this.getList();
              });
            }
          }
        }
      });
    },

说明:

以上代码直接复制肯定是无法正常使用的,因此对以上代码的重点进行二次提取说明。
1、第一部分正常校验就行,设置:ref :rule ,注意冒号
在这里插入图片描述
对应的提交部分校验代码如下图:
在这里插入图片描述
2、添加相关人员,并且绑定对应的校验规则,红色框框内都是重点
在这里插入图片描述在这里插入图片描述

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

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

相关文章

linux进行redis的安装并使用RDB进行数据迁移

现在有两台电脑&#xff0c;分别是A&#xff0c;B&#xff0c;现在我要把A电脑上的redis的数据迁移到B电脑上&#xff0c;B电脑上是没有安装redis的 1.找到A电脑的redis的版本 1.先启动A电脑的redis&#xff0c;一般来说&#xff0c;都是直接在linux的控制台输入&#xff1a;re…

数据结构与算法(1):递归函数的设计技巧

1.前言 哈喽小伙伴们大家好哦~从今天开始笔者就要开始正式学习数据结构与算法了&#xff0c;在这里写知识博客既是做一些学习笔记&#xff0c;又相当于给大家做知识分享咯&#xff0c;希望大家一起加油哦&#xff01; 2.正文 2.1递归的引入 在正式讲解递归之前&#xff0c;…

创建鸿蒙手机模拟器(HarmonyOS Emulator)

文 | Promise Sun 一.前提条件&#xff1a; 鸿蒙项目开发需要使用模拟器进行开发测试&#xff0c;但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请&#xff0c;参加“鸿蒙模拟器&#xff08;HarmonyOS Emulator&#xff09;Beta活动申请”。 申请审…

中间件的理解

内容来源于学习网站整理。【一看就会】什么是前端开发的中间件&#xff1f;_哔哩哔哩_bilibili 每日八股文~白话说mq&#xff0c;消息中间件_哔哩哔哩_bilibili 例如&#xff1a; 1&#xff09;两个人打电话&#xff0c;中间的通信网络就是中间件。 2&#xff09;菜鸟驿站&…

SpringBoot以及swagger的基本使用

1、SpringBoot是什么&#xff1f; 一种快速开发、启动Spring的框架、脚手架 遵循“约定优于配置”的思想&#xff0c;使得能够快速创建和配置Spring应用 2、SpringBoot的核心特性 自动配置&#xff0c;一些依赖、默认配置都预设好了&#xff0c;减少了配置量起步依赖&#x…

ROS2-Navigation2初体验:Gazebo“打不开”

输入ros2 launch nav2_bringup tb3_simulation_launch.py headless:False后只能打开RVIZ而无法打开Gazebo的问题&#xff0c;多次尝试解决后发现只是多等待一会儿即可&#xff0c;在此给同样学习Navigation2的朋友们提个醒 。 Getting Started — Nav2 1.0.0 documentation 1…

Mindspore框架CycleGAN模型实现图像风格迁移|(二)实例数据集(苹果2橘子)

Mindspore框架&#xff1a;CycleGAN模型实现图像风格迁移算法 Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;一&#xff09;CycleGAN神经网络模型构建Mindspore框架CycleGAN模型实现图像风格迁移|&#xff08;二&#xff09;实例数据集&#xff08;苹果2橘子&#…

补充性文件

第一 二章 1&#xff0c;关系型数据库是什么&#xff1f;其中的关系是指什么&#xff1f; 答&#xff1a; 关系型数据库是一些相关的表和其他数据库对象的集合。数据模型符合满足一定条件的二维表格式。 2&#xff0c;E-R模型&#xff1f; 实体为表。用矩形表示。属性为字…

嵌入式物联网在工业中的应用——案例分析

作者主页: 知孤云出岫 目录 嵌入式物联网在工业中的应用——案例分析引言1. 智能工厂1.1 实时监控与数据采集 2. 智能物流2.1 库存管理 3. 智能维护3.1 设备故障预测 4. 智能交通4.1 交通流量监测 总结 嵌入式物联网在工业中的应用——案例分析 引言 嵌入式物联网&#xff08;…

回车不搜索直接页面刷新问题解决

使用技术栈&#xff1a;vue3、elementUiPlus 问题&#xff1a;回车触发方法&#xff0c;会刷新整个页面&#xff0c;不执行搜索 解决方法&#xff1a;在搜索的表单中增加submit.native.prevent submit.native.prevent

项目管理:不懂跟进,项目白做

在职场上&#xff0c;工作的本质其实就是信息的传递与处理。而信息的及时传递&#xff0c;也就是我们常说的及时跟进&#xff0c;往往被许多项目经理和职场人忽视。 他们或许在暗地里埋头苦干&#xff0c;却忽略了明面上的沟通与汇报&#xff0c;最终导致合作方和内部团队都对…

利用AI辅助制作ppt封面

如何利用AI辅助制作一个炫酷的PPT封面 标题使用镂空字背景替换为动态视频 标题使用镂空字 1.首先&#xff0c;新建一个空白的ppt页面&#xff0c;插入一张你认为符合主题的图片&#xff0c;占满整个可视页面。 2.其次&#xff0c;插入一个矩形&#xff0c;右键选择设置形状格式…

【SpringBoot】SpringCache轻松启用Redis缓存

目录&#xff1a; 1.前言 2.常用注解 3.启用缓存 1.前言 Spring Cache是Spring提供的一种缓存抽象机制&#xff0c;旨在通过简化缓存操作来提高系统性能和响应速度。Spring Cache可以将方法的返回值缓存起来&#xff0c;当下次调用方法时如果从缓存中查询到了数据&#xf…

JDK,JRE,JVM三者之间的关系

Java程序不是直接在操作系统之上运行&#xff0c;而是运行在JVM&#xff08;java虚拟机&#xff09;之上。 Java源代码&#xff08;.java文件&#xff09;经编译器编译成字节码&#xff08;.class文件&#xff09;&#xff0c;JVM本质上就是一个负责解释执行Java字节码的程序。…

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…

鸿蒙跨平台框架ArkUI-X 小试牛刀视频播放

团队介绍 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合…

桥接器设计模式例题

笔有大、中、小三种型号&#xff0c;纸有A4、8K、16K三种型号&#xff0c;颜料有红、蓝、绿三种&#xff0c;请采用桥接器设计模型进行系统设计&#xff0c;能够使用不同型号的笔在不同型号的纸上利用不同颜色的颜料进行绘画。 下面这段代码展示了一个简单的桥接模式(桥接模式)…

数据结构之初始二叉树(2)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的前置知识&#xff08;概念、性质、、遍历&#xff09; 通过上篇文章的学习&#xff0c;我们…

Babylonjs学习笔记(十一)——加载geoJson文件

一、定义基本场景类 定义场景定义相机 import { ArcRotateCamera, Color4, CubeTexture, Engine, GlowLayer, KeyboardEventTypes, Scene, Vector3 } from babylonjs/core;import { AdvancedDynamicTexture } from babylonjs/gui;class SceneManager {public engine: Engine;…

springboot系列教程(一):简介与入门案例(含源码)

一、SpringBoot简介 SpringBoot继承了Spring优秀的基因&#xff0c;上手难度小简化配置&#xff0c;提供各种默认配置来简化项目配置内嵌式容器简化Web项目&#xff0c;简化编码 Spring Boot 则会帮助开发着快速启动一个 web 容器&#xff0c;在 Spring Boot 中&#xff0c;只…