el-form中使用v-model和prop实现动态校验

news2024/11/13 20:30:45

如何在Vue的el-form中使用v-model和prop实现动态校验,包括多个变量控制校验、数组循环校验和字段级条件显示。通过实例演示了如何配合rules和自定义验证函数来确保表单的完整性和有效性。

 

公式: 动态校验项的v-model的绑定值 = el-form的属性 :model的值 + '.' + :prop属性的值
以此反推 :prop属性的值
此公式适应与element、element-plus、ant-design-vue组件库的表单校验

场景:本文是三种表单校验
1.多个变量控制某一项校验
2.对于数组for循环,校验每一项
3.对于两个不同的字段,分别v-if显示隐藏的校验

 

 1. required: true 会有 * , 但仅是触发最后点击提交按钮时,校验某一项位必填;与输入事件或者选择或者失焦时候 怎么校验无关 (这时候的校验取决于是否写了具体的校验规则)为false则提交时可不填(默认false) 但是同时取决于validator的callback()返回是空还是返回报错提示
.
2.触发哪一条规则的校验和如何触发校验?
(1)触发哪一条规则的校验:
        a、如果该el-form-item绑定了具体某个:rules=“rules.abc”,则触发abc的规则
        b、默认取决于该el-form-item所绑定的prop字段,需要注意的是该prop属性在rules里必须要有,但是在form表单绑定的formData大对象里可有可无。
(2)如何触发该条校验:

取决于一级el-form-item下的子元素里的所有有的绑定了formData变量的元素和对应的trigger事件触发(所以可以多个输入框或选择框触发一项的校验事件)。需要注意该一级el-form-item下的子元素如果也包含了二级el-form-item和对应其他的prop,那么二级的el-form-item和对应其他的prop下的绑定变量和事件仅仅会触发二级自己的校验,而不会触发到一级的事件

一、多个变量控制某一项校验。

 

 简单代码:重点在于prop="zdxx"自定义绑定自定义校验事件

    <el-form v-loading="loading" ref="ruleFormRef" :model="formData" :rules="rules" label-width="160px"
      class="demo-ruleForm" :size="'default'" status-icon>
      <el-row :gutter="24">
        <el-col :span="12">
          <el-form-item label="云主机名称:" prop="virtualMachineName">
            <el-input placeholder="请输入" clearable />
          </el-form-item>
        </el-col>

        <el-col :span="24">
          <el-form-item label="站点信息:" prop="zdxx">
            <el-col :span="12">
              <el-checkbox :disabled="formData.applyVirtualMachineType === 2"
                v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.supportSiteAFlag" label="主调"
                size="large" @change="changeCheckbox('siteAIp')" />
              <el-checkbox disabled v-else v-model="formData.supportSiteAFlag" label="主调" size="large" />
            </el-col>
            <el-col :span="12">
              <el-checkbox :disabled="formData.applyVirtualMachineType === 2"
                v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.supportSiteBFlag" label="备调"
                size="large" @change="changeCheckbox('siteBIp')" />
              <el-checkbox disabled v-else v-model="formData.supportSiteBFlag" label="备调" size="large" />
            </el-col>
            <el-col :span="12">
              <template v-if="formData.supportSiteAFlag">
                <el-form-item prop="siteAIp">
                  <el-input :disabled="formData.applyVirtualMachineType === 2"
                    v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.siteAIp" placeholder="请输入"
                    clearable />
                  <span v-else>主调IP:<span class="ml">{{ formData.siteAIp }}</span></span>
                </el-form-item>
              </template>
            </el-col>
            <el-col :span="12">
              <template v-if="formData.supportSiteBFlag">
                <el-form-item prop="siteBIp">
                  <el-input :disabled="formData.applyVirtualMachineType === 2"
                    v-if="canEdit && formData.applyVirtualMachineType !== 2" v-model="formData.siteBIp" placeholder="请输入"
                    clearable />
                  <span v-else>备调IP:<span class="ml">{{ formData.siteBIp }}</span></span>
                </el-form-item>
              </template>
            </el-col>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>


let formData = ref({
  virtualMachineName: undefined,
  // zdxx: [],
  supportSiteAFlag: false,
  siteAIp: undefined,
  supportSiteBFlag: false,
  siteBIp: undefined,
})

const isSite = (rule, value, callback) => {
  if (!formData.value.supportSiteAFlag && !formData.value.supportSiteBFlag) {
    callback(new Error('请选择站点信息'))
  } else {
    callback()
  }
}

const rules = reactive({
  virtualMachineName: [{ required: true, message: '请输入云主机名称', trigger: 'blur' },],

  zdxx: [{ required: true, validator: isSite, trigger: 'change' },],
  // supportSiteAFlag: [{ required: true, validator: isSite, trigger: 'change' },],
  siteAIp: [{ validator: isIp1, trigger: 'blur' },],
  // supportSiteBFlag: [{ required: true, message: '请选择备调', trigger: 'change' },],
  siteBIp: [{ validator: isIp2, trigger: 'blur' },],
})

二、新增和删除表单项,动态校验。

el-form表单动态动态新增表单进行校验。直接参考 动态增减表单项

以下代码可直接复制:重点在于:prop :rules :key。
公式: 动态校验项的v-model的绑定值 = el-form的属性 :model的值 + '.' + :prop属性的值

根据公式倒推 :prop
例如:v-model=“domain.premium” 就是 dynamicValidateForm.premiumList[index].premium ,而且:model=“dynamicValidateForm”
所以得到 :prop = ‘premiumList.’ + index + ‘.premium’

<template>
  <div>

    <el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="110px" class="demo-dynamic">
      <div class="bor_box" v-for="(domain, index) in dynamicValidateForm.premiumList" :key="domain.key">
        <el-col :span="24">
          <div class="box4_div">

            <el-col :span="5">
              <el-form-item label="保费:" :prop="'premiumList.' + index + '.premium'" :rules="{required: true, message: '保费不能为空', trigger: 'blur'}">
                <el-input class="num_input" placeholder="请输入" v-model="domain.premium"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="保费率:" :prop="'premiumList.' + index + '.rate'" :rules="{required: true, message: '保费率不能为空', trigger: 'blur'}">
                <el-input class="num_input" placeholder="请输入" :precision="2" :step="0.01" v-model="domain.rate"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="上游费用率:" :prop="'premiumList.' + index + '.feeRate'" :rules="{required: true, message: '上游费用率不能为空', trigger: 'blur'}">
                <el-input class="num_input" placeholder="请输入" :max="100" v-model="domain.feeRate"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="上游费用额:" :prop="'premiumList.' + index + '.fee'" :rules="{required: true, message: '上游费用额不能为空', trigger: 'blur'}">
                <el-input class="num_input" placeholder="请输入" v-model="domain.fee"></el-input>
              </el-form-item>
            </el-col>

            <el-col :span="4">
              <el-button @click.prevent="removeDomain(domain,index)">删除</el-button>
            </el-col>

          </div>
        </el-col>

      </div>
      <div>
        <el-form-item>
          <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
          <el-button @click="addDomain">添加保费</el-button>
          <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
        </el-form-item>

      </div>

    </el-form>
  </div>
</template>

<script>
export default {
  data () {
    return {
      dynamicValidateForm: {
        premiumList: [{
          selected: 'Y', premium: undefined, rate: undefined, feeRate: undefined, fee: undefined, baofei1_unit: '', shangyoufeiyonge_unit: '', downRate: undefined, downFee: undefined, xiayoufeiyonge_unit: '',
        }],

      },
    }
  },
  created () {

  },
  methods: {
    submitForm (formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          alert('submit!')
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm (formName) {
      this.$refs[formName].resetFields()
    },
    removeDomain (item, index) {
      if (index !== 0) {
        this.dynamicValidateForm.premiumList.splice(index, 1)
      }
    },

    addDomain () {

      this.dynamicValidateForm.premiumList.push({
        selected: 'N', premium: undefined, rate: undefined, feeRate: undefined, fee: undefined, baofei1_unit: '', shangyoufeiyonge_unit: '', downRate: undefined, downFee: undefined, xiayoufeiyonge_unit: '',
        key: Date.now()
      })
    },
  },
}
</script>

<style lang="less" scoped>
.bor_box {
  margin-left: 50px;
  margin-bottom: 10px;

  overflow: hidden;
}
</style>

三、el-form表单校验v-if不生效、el-form表单校验v-show不生效:

例如有个表单项,通过控制显示两个不同的表单项内容,分别需要校验对应的表单项即可。
如果是直接用v-if,会发现切换时候,校验不生效;
如果直接使用v-show,又发现即使不切换,隐藏了另外的表单项,也会触发校验规则。
正确做法是:使用v-if控制表单项的显示隐藏,同时需要给el-form-item加上自己的 prop=" " 和 key=" " ,这样才能区分。当然:rules 也要有自己对应的提示。

    <template v-if="flag">
      <el-form-item label="姓名:" prop="name" key="name" :rules="rules.name">
        <el-input v-model="formData.name" placeholder=""></el-input>
      </el-form-item>
    </template>
    <template v-else>
      <el-form-item label="退回原因:" prop="desc" key="desc" :rules="rules.desc">
        <el-input type="textarea" maxlength="500" show-word-limit v-model="formData.desc" placeholder="请填写退回原因"></el-input>
      </el-form-item>
    </template>

 

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

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

相关文章

PCSE不同播种时间的对比

目录 简介对比图源代码简介 设置为2022年10月15日播种,然后每隔5天往后播种一次,然后探究播种时间对于作物各个长势的影响 对比图 源代码 import sys, os import matplotlib from matplotlib import style matplotlib.style.use("seaborn-whitegrid") import ma…

ST 表算法

ST 表 ST 表&#xff0c;主要思想是空间换时间&#xff0c;用于解决可重复贡献问题和 RMQ 问题。 可重复贡献问题 指某个运算 o p op op&#xff0c;有 x o p x x x\ op\ x\ \ x x op x x 。例如 m a x ( x , x ) x m i n ( x , x ) x g c d ( x , x ) x max(x,x)x\…

Linux基础环境开发工具gcc/g++ make/Makefile git

1.Linux编译器-gcc/g使用 1. 预处理&#xff08;进行宏替换) 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标…

UE基础 —— Components

目录 Component Instancing Instanced Static Mesh Component Instanced Static Mesh Differences of an ISM and a Static Mesh Component Hierarchical Instanced Static Mesh Instancing Systems Working with ISMs Prefabrication Custom Data Creating and Edit…

吴恩达机器学习课后作业-04神经网络

神经网络 对y进行独立热编码处理&#xff08;one-hot处理&#xff09;序列化权重参数前向传播代价函数反向传播神经网络优化可视化隐藏层 对y进行独立热编码处理&#xff08;one-hot处理&#xff09; def one_hot_encoder(raw_y):result[]for i in raw_y:#1-10y_tempnp.zeros(1…

网络编程之初识

目录 ​前言 发展史 网络互连 局域网(LAN) 广域网(WAN) 网络通信基础 IP地址 特殊IP地址 端口号 网络协议 协议的作用 五元组 协议分层 含义 OSI七层模型 TCP/IP五层协议 网络设备所在分层 封装和分用 发送方 接收方 前言 在这个科技发达的时代&#xff0…

初识C语言指针(3)

目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟⼆维数组 结语 1. 数组名的理解 对于数组名想必大家并不陌生&#xff0c;数组名就是该数组首元素的地址&#xff0c;设想有一个arr 数组。我们…

文本是否换行显示

多行文本 1、white-space: pre-wrap; 保留连续的空白符。在遇到换行符或 <br> 元素时&#xff0c;或者根据填充行框盒子的需要换行。 2、word-break: break-word; 如果单词太长而无法在当前行容纳&#xff0c;浏览器可以尝试在单词内部进行断行&#xff0c;以避免内容…

轻松获得ADSL代理服务

ADSL 代理服务接入常见问答 在当今激烈的网络爬虫与反爬虫斗争中&#xff0c;各大网站和应用程序采取的风险管理手段愈加严格&#xff0c;其中最常见的一种措施是 IP 封禁。 为了有效应对 IP 封禁带来的挑战&#xff0c;设置代理服务成为一种非常有效的解决方案。配置完代理后…

数论之高斯消元

高斯消元&#xff1a; 前置知识&#xff1a; 高斯消元五步骤法 枚举每一列c 找到绝对值最大的一行 将该行换到最上面&#xff08;第r行&#xff09; 将该行的第c列数字变为1 把该行下面的第c列数字全部变为0 代回求解 #include <bits/stdc.h>using namespace std;…

Linux LVM 详解

Linux LVM 详解 1. 简介 参考链接&#xff1a; https://blog.csdn.net/qq_35745940/article/details/119054949 https://blog.csdn.net/FP202530/article/details/125140176 &#x1f449; LVM&#xff08;Logical Volume Manager&#xff09;逻辑卷管理 是在硬盘分区和文件系…

面向对象02:构造器详解

本节内容视频链接&#xff1a;面向对象05&#xff1a;构造器详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p64&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 构造器&#xff08;‌Constructor&#xff09;‌是一种特殊的方法&#xff0c;‌用于初始…

解决Intel-12代13代14代大小核调用导致VMware虚拟机性能低

0x01 设备信息 近期入手的是一台2023款 y9000p 游戏本&#xff0c;CPU为13500h 显卡为RTX4060。 0x02 VMware虚拟机遇到的性能问题 尤其是windows虚机明显感觉性能非常差&#xff0c;开几个网页都很卡。 我一度怀疑是CPU i5性能差&#xff0c;还没我的轻薄本运行速度快&…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“&#xff0c;”所以我这边 分隔符选择了*号 写了两行需要测试的用例&#xff0c;需要添加一个“循环控制器” 线程组->添加-&g…

省时又省力!2024年最新录屏软件快捷键大放送

录屏工具可以帮我们录制教学视频、游戏精彩瞬间等内容。很多时候录制的过程瞬息万变&#xff0c;如果合理使用录屏快捷键就会极大的缓解我们录制时候的慌乱。今天&#xff0c;就让我们一起探索那些“大家都在用的录屏软件快捷键”&#xff0c;看看它们是如何让我们的录制工作变…

centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)

centos7 xtrabackup mysql&#xff08;8&#xff09;压缩 全量备份 还原&#xff08;4&#xff09; 查看版本&#xff1a; xtrabackup --version qpress --help 主机端 mysql -u root -p 1234aA~1 use company_pro; insert into employee(name) value (‘20240823_1401’);…

2024.8.23

130124202408231008 DATE #:20240823 ITEM #:DOC WEEK #:FRIDAY DAIL #:捌月二十 TAGS < BGM "Forest Mixtape&#xff08;Tsuki)" > < theme oi-graph theory Eulerian > < [NULL] > < [空] > < [空] >冰岛的温柔是克莱因蓝再加点…

使用nfs搭建文件共享系统,以及windows环境如何访问linux系统中的文件共享目录

31、简介 在一些场景中&#xff0c;我们需要多台机器进行磁盘文件共享&#xff0c;集群中如果有linux机器&#xff0c;也有windows机器&#xff0c;如何设置进行文件共享&#xff0c;本文将详细说明。 注&#xff1a;本文linux系统使用的是 centos7&#xff0c;windows使用的是…

【Qt】常见控件 —— QWidget

文章目录 QWidget 的基本介绍QWidget 的 enable 属性QWidget 的 geometry属性 QWidget 的基本介绍 Qt 中 的 各种控件 都继承自 QWidget类 在 Qt designer 右侧 就显示出 QWidget的各种属性 并且也可以直接进行编辑 QWidget 的 enable 属性 enable 描述一个控件是否处于可用 …

前端面试题整理-webpack

实现前端模块化&#xff0c;将多个 js&#xff0c;打包成一个 bundle.js (其他类型文件交由各自的 loader 处理) 1. webpack 了解吗&#xff1f;大概介绍一下 一种打包工具&#xff0c;实现前端模块化&#xff0c;将多个 js&#xff0c;打包成一个 bundle.js (其他类型文件交…