elform 动态 rules

news2024/11/17 9:58:55

一.使用v-for渲染时

前端由于某些需求场景需要,部分表单的渲染是通过 v-for循环渲染显示,此时如何实现表单验证呢?如下,点击第一行的+号可以动态的增加更多行表单,不同于单一固定的表单行[参见下文一般情况下],我们可以通过固定的prop绑定来验证,多行动态时,则无法使用原有方案进行验证!!!

 页面代码实现如下:

注意:此处的el-form-item管理着三个表单元件!!提示时只使用一个el-form-item携带的提示框!!!

<div class="card-item flex-col"
    style="width:auto;position:relative;padding-left: 0px;padding-top: 0px;">
    <el-checkbox v-model="adverseEventChecked">不良事件提醒</el-checkbox>
    <slot v-for="(item, index) in adverseEventList">
        <el-form-item label="" prop="formValidator" class="flexview" :rules="[
        { required: true, validator: (rule, value, callback) => {
            if (!item.adverseEventCrf || item.adverseEventCrf.length === 0)
            {
                callback('请选择CRF模板')
            }
            else if (!item.adverseEventTopic || item.adverseEventTopic.length === 0)
            {
                callback('请选择CRF模板中的题目')
            }
            else{
                callback()
            }
        }, trigger: 'blur' }]">
            <div :key="index" class="card-item flexview" v-if="adverseEventChecked"
                style="width:auto;position:relative;padding-left: 0px;padding-top: 10px;">
                <el-select v-model="item.adverseEventCrf" size="medium"
                    style="width: 240px;" placeholder="选择CRF">
                    <el-option v-for="item in followCrfOptions" :key="item.value"
                        :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
                <span
                    style="width: 76px;font-size:15px;color:#333333;padding:0px 6px;">CRF中的</span>
                <el-select v-model="item.adverseEventTopic" size="medium"
                    style="width: 240px;" placeholder="选择题目">
                    <el-option v-for="item in followTopicOptions" :key="item.value"
                        :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
                <span style="width: 14px;"></span>
                <el-select size="medium" v-model="item.adverseEventRelation"
                    style="width: 100px;" placeholder="关系">
                    <el-option v-for="item in adverseEventRelationOptions"
                        :key="item.value" :label="item.label" :value="item.value">
                    </el-option>
                </el-select>

                <i v-if="index === 0" class="el-icon-circle-plus-outline"
                    style="color:rgb(0, 139, 255);padding-left:10px"
                    @click="addEventAction"></i>
                <i v-else class="el-icon-delete"
                    style="color:rgb(226,115,112);padding-left:10px"
                    @click="delEventAction(index)"></i>
            </div>
        </el-form-item>
    </slot>

</div>

填写相关的下拉数据,测试效果如下,可以看到正确的检验并进行了提示信息。

 其核心代码块则为:指定prop="formValidator",此时不需要去data里面定义formValidator,但是View上必须指定prop否则无法触发检验规则,内部直接使用遍历的item访问其值做出判断给出反馈信息即可!给出反馈信息的callback写法有所不同:

一般写法为:

callback(new Error('请选择CRF模板'));
而此处写法为:
callback('请选择CRF模板');


item即为动态遍历的V-FOR对象!!!

<el-form-item label="" class="flexview" :rules="[
        { required: true, validator: (rule, value, callback) => {
            if (!item.adverseEventCrf || item.adverseEventCrf.length === 0)
            {
                callback('请选择CRF模板')
            }
            else if (!item.adverseEventTopic || item.adverseEventTopic.length === 0)
            {
                callback('请选择CRF模板中的题目')
            }
            else{
                callback()
            }
        }, trigger: 'blur' }]">

二.一般情况下

1、规则校验直接写在data里面

<el-form :model="productParam" ref="productSaleForm" :rules="saleRules" label-width="90px" size="small">
	<el-form-item label="赠送积分" prop="gift.giftPoint" class="stargod-form-row__flex">
	  <el-input v-model="productParam.gift.giftPoint" maxlength="5" placeholder="必填">
	    <template slot="append">小星星</template>
	  </el-input>
	</el-form-item>
</el-form>


data () {
  saleRules: {
    gift: {
      giftPoint: [
        { required: true, message: '请填写积分', trigger: 'blur' },
        { pattern: /^[0-9]+$/, message: '积分需为数值类型', trigger: 'blur' }
      ]
    }
  }
}

2、规则校验虽然写在data里面,自定义校验规则

<div class="card-item flexview" :class="[(index > 0) ? 'ml-20' : '']" style="width:460px;position:relative;padding-left: 0px;padding-top: 0px;">
    <el-form-item label="" prop="followDayValue" class="flexview">
        <span
            style="font-size:15px;color:#333333;padding-right:6px;width: 50px;">每</span>
        <el-input size="medium" placeholder="请输入" v-model="ruleForm.followDayValue">
            <template slot="append">
                <el-select v-model="followUnits" size="small" style="width: 60px;">
                    <el-option v-for="item in followUnitsOptions" :key="item.value"
                        :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
            </template>
        </el-input>
        <span
            style="width: 150px;font-size:15px;color:#333333;padding-left:6px;">随访一次</span>
    </el-form-item>
</div>
</div>
<div v-if="followFrequency === '3'" class="flexview"
style="background-color: #fafafa;padding-left: 20px;">
<div class="card-item flexview" :class="[(index > 0) ? 'ml-20' : '']"
    style="width:460px;position:relative;padding-left: 0px;padding-top: 0px;">
    <el-form-item label="" prop="followDayValue" class="flexview">
        <span
            style="font-size:15px;color:#333333;padding-right:6px;width: 50px;">间隔</span>
        <el-input size="medium" placeholder="以逗号分隔,如1,2,3"
            v-model="ruleForm.followDayValue">
            <template slot="append">
                <el-select v-model="followUnits" size="small" style="width: 60px;">
                    <el-option v-for="item in followUnitsOptions" :key="item.value"
                        :label="item.label" :value="item.value">
                    </el-option>
                </el-select>
            </template>
        </el-input>
        <span
            style="width: 150px;font-size:15px;color:#333333;padding-left:6px;">随访一次</span>
    </el-form-item>
</div>

注意这里:必须是箭头函数,否则this指向是函数指向而不是页面this指向无法取出对应的变量值!!!
validator: (rule, value, callback) => {}

ruleForm: {
    followDayValue: '',
    followCrf: null,
    followTopic: null,
    afterTimeValue: null,
    afterTimeValueUnits: 1,
},
rules: {
    followDayValue: [
        {
            validator: (rule, value, callback) => {
                if ((!this.ruleForm.followDayValue || this.ruleForm.followDayValue.length === 0) && parseInt(this.followFrequency) > 1) {
                    callback(new Error('请填写随访频率'));
                }
                else if (this.followRadio === '1' && parseInt(this.followFrequency) === 3) {
                    if (this.ruleForm.followDayValue.split(',').length > this.followCount) {
                        callback(new Error('随访频率间隔数不能大于随访次数'));
                    }
                    else {
                        callback();
                    }
                }
            }, trigger: 'blur'
        }
    ],
    followDateTree: [{
        validator: (rule, value, callback) => {
            debugger
            if (this.followDate === 3) {
                if (!this.ruleForm.followCrf || this.ruleForm.followCrf.length === 0) {
                    callback(new Error('请选择入组阶段时间题目触发开始时间CRF模板'));
                }
                else if (!this.ruleForm.followTopic || this.ruleForm.followTopic.length === 0) {
                    callback(new Error('请选择入组阶段时间题目触发开始时间题目'));
                }
                else if (!this.ruleForm.afterTimeValue || this.ruleForm.afterTimeValue.length === 0) {
                    callback(new Error('入组阶段时间题目触发开始时间数值应为正整数或0'));
                }
                else {
                    callback();
                }
            }
            else {
                callback();
            }
        }, trigger: 'blur'
    }],
},

3、固定对象,校验规则直接写在dom上

注意:此时直接使用变量名XXX或其定义的对象a.xxx,而非this.XXX或者this.a.xxx

<el-form-item label="" prop="formAutoStopCrfValidator" class="flexview" 
    :rules="[{ required: true, validator: (rule, value, callback) => {
        if (!autoStopCrf || autoStopCrf.length === 0)
        {
            callback('请选择CRF模板')
        }
        else if (!autoStopTopic || autoStopTopic.length === 0)
        {
            callback('请选择CRF模板中的题目')
        }
        else{
            callback()
        }
    }, trigger: 'blur' }]">
    <div class="card-item flexview" v-if="autoStopChecked"
        style="width:auto;position:relative;padding-left: 0px;padding-top: 10px;">
        <el-select v-model="autoStopCrf" size="medium" style="width: 240px;"
            placeholder="选择CRF">
            <el-option v-for="item in followCrfOptions" :key="item.value"
                :label="item.label" :value="item.value">
            </el-option>
        </el-select>
        <span
            style="width: 76px;font-size:15px;color:#333333;padding:0px 6px;">CRF中的</span>
        <el-select v-model="autoStopTopic" size="medium" style="width: 240px;"
            placeholder="选择题目">
            <el-option v-for="item in followTopicOptions" :key="item.value"
                :label="item.label" :value="item.value">
            </el-option>
        </el-select>
        <span style="width: 14px;"></span>
        <el-select size="medium" v-model="autoStopRelation" style="width: 100px;"
            placeholder="关系">
            <el-option v-for="item in adverseEventRelationOptions" :key="item.value"
                :label="item.label" :value="item.value">
            </el-option>
        </el-select>
    </div>
</el-form-item>

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

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

相关文章

book-riscv-rev1.pdf 翻译(自用)第一章 操作系统接口

Job of operating system: 操作系统使得多个程序分享一台计算机&#xff0c;提供一系列仅靠硬件无法支持的服务。 管理与抽象低级别硬件&#xff08;如&#xff1a;文件处理程序不需要关注使用哪种硬盘&#xff09;使得多个程序分享硬件&#xff08;programs that can run at…

【代码练习】旋转矩阵题解思路记录分析

题目 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵&#xff0c;使其变为: [ [7…

【C语言】学习

文章目录 前言1. warm up1.1 输出helloworld1.2 示例1.3 C语言程序结构 前言 以后要学习操作系统深度学习了&#xff0c;所以C语言就不可缺少了。 1. warm up 1.1 输出helloworld #include<stdio.h> void main() {printf("Hello World!!"); }std 标准 io输…

JS案例分析-某国际音x-tt-params参数分析

今天我们要分析的网站是&#xff1a;https://www.tiktok.com/selenagomez?langen&#xff0c;参数名字叫x-tt-params。 先来抓个包 这个接口是用户视频列表url&#xff0c;参数叫x-tt-params&#xff0c;该接口中还有其他参数像msToken&#xff0c;X-Bogus&#xff0c; _sig…

Cartesi 2023 年 4 月回顾

查看你不想错过的更新 2023年5月1日&#xff0c;感谢Cartesi生态系统中所有了不起的构建者&#xff01; 在一个激动人心的旅程之后&#xff0c;我们的首届全球线上黑客马拉松正式结束了&#xff01;有超过200名注册建造者参加&#xff0c;见证了所有参与者展示的巨大才华和奉献…

【Android】串口通信的理论与使用教程

Android系统诞生这十几年以来&#xff0c;Android开发工程师岗位经历了由盛转衰的过程&#xff0c;目前纯UI的Android APP已经鲜有公司愿意花费巨资去开发&#xff0c;Android APP开发的业务也仅剩游戏、物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;等…

springcloud:新一代分布式定时任务框架——PowerJob

0. 引言 之前我们讲解过主流的分布式定时任务框架xxl-job&#xff0c;随着技术的迭代更新&#xff0c;更多的定时任务框架也开始出现&#xff0c;今天我们来看一看新一代的定时任务框架PowerJob 1. PowerJob简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#x…

Java设计原则之单一职责原则、开闭原则、里氏代换原则

文章目录 面向对象设计原则概述 单一职责原则 开闭原则 里氏代换原则 面向对象设计原则概述 软件的可维护性&#xff08;Maintainability&#xff09;和可复用性&#xff08;Reusability&#xff09;是两个非常重要的用于衡量软件质量的属性&#xff0c;软件的可维护性是指软…

Ubuntu常用命令总结

目录 1&#xff09;安装包命令及下载包命令 2&#xff09;阅读协议内容 3&#xff09;执行sh文件&#xff1a; 4&#xff09;创建虚拟环境 5&#xff09;激活虚拟环境 6&#xff09;虚拟环境中安装包 7&#xff09;安装上传代码工具 8&#xff09;代码上传 9&#xff09…

传输控制协议(TCP)知识点总结

文章目录 传输控制协议&#xff08;TCP)知识点总结介绍数据包格式TCP连接的建立和关闭三次握手四次挥手一张图展示这些过程 其他知识 传输控制协议&#xff08;TCP)知识点总结 维基百科: 传输控制协议&#xff08;TCP&#xff09;是Internet协议套件中的主要协议之一。它起源于…

五种最危险的新兴网络攻击技术

SANS研究所的网络专家揭示了包括网络罪犯和民族国家行为者在内的网络攻击者正在使用的五种最危险的新兴网络攻击技术。在旧金山举行的RSA网络安全会议上&#xff0c;由SANS研究所的几位分析师组成的讨论组讨论了新兴的网络攻击战术、技术和程序&#xff0c;并提供了如何为企业做…

使用GLSL来实现实时滤镜的效果

1. 先来明确几个概念 1.1 OpenGL OpenGL 全称为 Open Graphics Library&#xff08;开放图形库&#xff09;。 是用于渲染 2D 或 3D 图像的跨语言跨平台的应用程序编程接口&#xff0c;用于CPU控制GPU做图像渲染&#xff0c;是一套API。 提供设计人员一个共同的硬件驱动标准…

虚函数、静态绑定和动态绑定

静态绑定 class Base { public:Base(int data) :ma(data) {}void show() { cout << "Base::show()" << endl; }void show(int) { cout << "Base::show(int)" << endl; }protected:int ma; };class Derive : public Base { public…

Go | 一分钟掌握Go | 10 - 反射

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 反射你以为只在Java中有吗&#xff1f;Go也有反射机制&#xff0c;很多…

【JavaEE】应用层自定义协议及UDP协议

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将为大家介绍应用层中UDP协议~~ 在应用层这里&#xff0c;虽然存在一些现有的协议&#xff08;HTTP&#xff09;&#xff0c;但是也有很多情况&#xff0c;需要程序猿自定制协议&a…

OJ 功能介绍 使用手册

目录 服务器配置 OJ界面展示 用户管理 一、批量导入&#xff08;从方便管理角度建议以 学生姓名 作为 用户名 &#xff09; 二、批量生成临时用户 后期修改成需要的用户名和密码 &#xff08;学生登录后修改密码&#xff09; 三、用户自行注册&#xff08;填写邮箱获取验证码…

Nmap入门到高级【第九章】

预计更新Nmap基础知识 1.1 Nmap简介和历史 1.2 Nmap安装和使用方法 1.3 Nmap扫描技术和扫描选项 Nmap扫描技术 2.1 端口扫描技术 2.2 操作系统检测技术 2.3 服务和应用程序检测技术 2.4 漏洞检测技术 Nmap扫描选项 3.1 扫描类型选项 3.2 过滤器选项 3.3 探测选项 3.4 输出选项…

【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通信例程

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

Docker consul服务注册与发现

目录 一、服务注册与发现 1、什么是服务注册与发现 2、什么是consul 3、consul提供的一些关键特性 4、容器更新与发现 二、基于nginx与consul构建自动发现即高可用的Docker服务架构 consul服务器部署 1、建立consul 2、查看集群信息 3、通过http获取集群信息 regist…

SpringBoot+vue文件上传下载预览分片上传

学习链接 Blob & File 上传文件 前台 整个过程&#xff0c;就是在使用FormData 添加 上File&#xff08;这个Blob&#xff09;&#xff0c;并且key要和后台的名字对应上在点击上传按钮开始上传之前&#xff0c;使用了URL.createObjectURL(File)创建blobUrl&#xff0c;…