iView中Form表单的验证(自定义验证、动态增减项验证)

news/2024/7/10 2:54:20 标签: vue, iView Vue 2.0 管理系统模板, 前端

在使用 iView框架做后台管理系统重构,碰到一个能使用到多种验证场景的配置页面,记录一下各种验证方式

  • 【页面】
    在这里插入图片描述
  • 【重点代码】
<template>
	<div style="max-height: 500px; overflow: scroll;">
    <Form ref="createForm" :model="newConfig" :rules="ruleValidate" label-width="150">
      <FormItem label="名称" prop="name">
        <Input v-model="newConfig.name" maxlength="100" />
      </FormItem>
      <!-- 4.动态增减的表单项集合 —— 【对象数组】 -->
      <Card dis-hover v-for="(item, index) in newConfig.rules" :key="'o-' + index">
        <p slot="title">规则</p>
        <div slot="extra">
          <Button type="primary" icon="md-add" @click="addRule" class="multiBtnsSpace" v-if="index == newConfig.rules.length - 1"></Button>
          <Button type="error" icon="md-remove" @click="removeRule(index)" v-if="newConfig.rules.length > 1"></Button>
        </div>
        <FormItem label="No." :prop="'rules.' + index + '.index'" :rules="dynamicRules.index">
          <Input v-model="item.index" />
        </FormItem>
        <!-- !!!重点:动态增减项的 prop:数组变量名 + 遍历索引 + 元素属性名 -->
        <FormItem label="协议" :prop="'rules.' + index + '.protocol'" :rules="dynamicRules.protocol">
          <Select v-model="item.protocol">
            <Option v-for="o in protocolOptions" :value="o.id" :key="`o-${o.id}`">{{ o.name }}</Option>
          </Select>
        </FormItem>
        <FormItem label="IP" :prop="'rules.' + index + '.ip'" :rules="dynamicRules.ip">
          <Input v-model="item.ip" />
        </FormItem>
        <!-- 根据 v-if条件展示的 FormItem需要加上key,避免显示出来时,复用原有的 DOM导致原先位置的 报错信息仍然存在 -->
        <!-- 一个配置项中包含多个参数时,可以对外层的 FormItem加 required属性,仅用于页面上能展示出必填的符号 *,真正的数据校验,是针对内部各个 FormItem各自做校验 -->
        <FormItem label="Port" v-if="item.protocol == 3 || item.protocol == 4" required :key="'port-' + index">
          <Row :gutter="5">
            <iCol span="7">
              <FormItem :prop="'rules.' + index + '.portType'" :rules="dynamicRules.portType">
                <Select v-model="item.portType" @on-change="changePortType('src', index)">
                  <Option v-for="o in compareOptions" :value="o.id" :key="`o-${o.id}`">{{ o.name }}</Option>
                </Select>
              </FormItem>
            </iCol>
            <iCol span="7">
              <FormItem :prop="'rules.' + index + '.port'" :rules="dynamicRules.port">
                <Input v-model="item.port" />
              </FormItem>
            </iCol>
            <iCol span="1" style="text-align: center;" v-if="item.portType== 4">
              -
            </iCol>
            <iCol span="7">
              <FormItem :prop="'rules.' + index + '.port2'" v-if="item.portType== 4" :rules="dynamicRules.port2">
                <Input v-model="item.port2" />
              </FormItem>
            </iCol>
          </Row>
        </FormItem>
      </Card>
    </Form>
	</div>
</template>
<script>
	export default {
		name: "create",
		data () {
			return {
		        newConfig: {
		          name: '',
		          rules: [ // 这个参数是一个数组,页面有 + - 按钮动态增减数组中的元素项
		            {
		              index: '',
		              protocol: '',
		              ip: '',
		              portType: '',
		              port: '',
		              port2: '', // 范围的第二个值
		            }
		          ]
		        }
			}
    },
    computed: {
      // 非动态部分校验
      ruleValidate() {
        return {
          name: [
            // 1.普通校验--必填 required
            { required: true, message: '必填项', trigger: 'blur' },
            // 1.普通校验--字符长度 max
            { type: 'string', max: 100, message: '文字长度超出限制', trigger: 'blur' }
          ]
        }
      },
      // 动态部分校验
      dynamicRules() {
        return {
          ...
          srcPort: [
            // 2.正则校验 pattern
            { pattern: /^[0-9]|[1-9]([0-9]{1,3})|[1-5]([0-9]{1,4})$/, message: '字段格式错误', trigger: 'blur' },
            // 3.自定义校验 validator
            { validator: this.validateCustom, trigger: 'blur' }
          ],
          ...
        }
      }
    },
		methods: {
      // 3.自定义校验 方法
      validateCustom(rule, value, callback) {
        if (/*错误条件*/) {
          // 错误 -- 调用 callback()方法,传入报错信息
          callback('报错信息');
        } else {
          // 无错误 --调用 callback()方法,不传参数
          callback();
        }
      }
    }
	}
</script>
  • 【动态增减项校验中的 prop】
    在这里插入图片描述
  • 【一个配置项中包含多个参数】
    在这里插入图片描述

http://www.niftyadmin.cn/n/1371009.html

相关文章

安装 statconn 使R与c#交互

很久以前完成过&#xff0c;但是最近重新折腾发现全忘了&#xff0c;所以记下来。 1.安装 R 2.安装 R studio 3.去 http://rcom.univie.ac.at/download.html 下载 statconnDCOM 注意是非盈利版本的&#xff0c;其他的价格比较吓人。4. 在 R studio 界面中 输入:insta…

浏览器左上角的小图标怎么整不掉_IOS14正式版已推送,分屏操作;来电小窗更改默认浏览器真香...

今天熬夜看完发布会的感觉就两个字&#xff1a;**&#xff1f;&#xff1f;&#xff1f;啥也不是&#xff01;&#xff01;&#xff01;唯一让哎妹有记忆点的事情就是&#xff1a;iOS 14 正式版明天发布。所以没升 iOS 14 的小伙伴&#xff0c;可以等着安排一波啦~新增小组件这…

Element-ui的 Table简单封装——2022.05.17更新

换工作&#xff0c;使用UI框架从 iVew换到 Element-ui&#xff0c;发现 Element-ui的 Table没有 iView方便&#xff0c;需要做一点封装&#xff0c;记录一下&#xff0c;暂时做得很简单&#xff0c;只加上一些必要的属性&#xff0c;其他属性有需要再加 2022.05.17 经过一段时间…

idea每次都要配置tomcat_pycharm每次打开项目都需要配置解释器和安装库问题

前言最近在使用pycharm开发新项目的时候,每次打开新的工程都显示没有解释器,要不加了解释器就是代码一堆没有红色错误提示没有模块问题,找到了解决办法做一个记录.问题打开新项目提示没有解释器按照操作选择别的项目解释器.file–>settings然后代码一堆模块问题报错点击底部…

C++ C# 默认对齐是8字节

C C# 默认对齐是8字节 以上&#xff0c;一直以为是4字节&#xff0c;尼玛

Mac安装 nvm 以及 node

小白&#xff0c;刚买的 Mac&#xff0c;在自己摸索着装环境和软件&#xff0c;遇到很多问题&#xff0c;简单记录一下 1. 安装 nvm 直接参考nvm的 github地址&#xff1a; https://github.com/nvm-sh/nvm &#xff08;当前版本 v0.36.0&#xff0c;在 gitbub上可以找到最新的…

rx590 黑苹果 无货_应粉丝要求花9000配了一台高端黑苹果电脑,大家看看值不值吧!...

粉丝说准备花7K左右配一台组机&#xff0c;黑苹果系统主要用来剪辑视频&#xff0c;WIN10可以玩玩游戏。要求苹果卡塔林娜系统WIN10最新版双系统。今天就来说说配置过程中的心得和一些注意事项。第一步就是按价格标准购买配件&#xff0c;明细如下&#xff1a;CPU&#xff1a;I…

双网卡 网关地址 外部映射 无反应问题

问题描述&#xff1a; 机器 双网卡&#xff0c;分别连接 交易网段 和 办公网段。 映射端口到 外网6501 &#xff08;走办公网段的外网&#xff09; 发现从内网访问 交易网段 6501 和 办公网段6501 均可以 但是从外网无法访问&#xff0c;防火墙也全部关闭。 解决&#xff1a;…