欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-25 15:47:28
...

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

  • 【页面】
    iView中Form表单的验证(自定义验证、动态增减项验证)
  • 【重点代码】
<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 == newBusi.rules.length - 1"></Button>
          <Button type="error" icon="md-remove" @click="removeRule(index)" v-if="newBusi.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】
    iView中Form表单的验证(自定义验证、动态增减项验证)
  • 【一个配置项中包含多个参数】
    iView中Form表单的验证(自定义验证、动态增减项验证)