el-form表单 动态渲染下拉选项值 校验失效 不成功的问题

文章展示了在Vue.js应用中如何根据某个字段的值动态改变其他字段的选项,并进行相应的验证。重点在于`el-form`和自定义组件`JNPF-TreeSelect`的使用,以及`change`事件的处理来更新和校验数据。同时,文章提到了深层校验和页面更新的重要性。
摘要由CSDN通过智能技术生成

问题发现

在日常开发中少不了会有根据某一项的值去动态改变另一项选项值的需求

在这里插入图片描述

例如 整改人 必须是 整改单位下面对应的人
不出意外的话会出现各种情况下的验证失效
在这里插入图片描述

下面直接上代码

页面


    <el-dialog :title="!type ? '新增' : '编辑'" :close-on-click-modal="false" append-to-body
      :visible.sync="visible" class="JNPF-dialog JNPF-dialog_center" lock-scroll width="600px">
      <el-form ref="elForm" :model="dataForm" :rules="rules" size="small" label-width="120px"
        label-position="right">
        <el-form-item label="区域:" prop="dutyName">
          <el-input v-model="dataForm.dutyName" placeholder="请输入" />
        </el-form-item>
        <el-form-item label="整改单位:" prop="dutyUnitStr">
          <JNPF-TreeSelect v-model="dataForm.dutyUnitStr" :options="deptNameOptions"
            :multiple="true" :props="{value:'fullName', label: 'fullName', children: 'children', }"
            placeholder="请选择" @change="changeOrganize" />
        </el-form-item>
        <el-form-item label="整改人:" prop="dutyMemberStr">
          <el-select v-model="dataForm.dutyMemberStr" placeholder="请选择" clearable multiple
            :style="{ width: '100%' }" :disabled="disabledMan" @change="clickMember">
            <el-option v-for="(item, index) in dutyMemberOptions" :key="index"
              :label="item.realName" :value="item.realName"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="closeSubmit() "> 取 消</el-button>
        <el-button type="primary" @click="dataFormSubmit()" :loading="btnLoading">
          确 定</el-button>
      </span>
    </el-dialog>

校验规则

data() {
    return {
      deptNameOptions: [],
      dutyMemberOptions: [],
      disabledMan: true,
      dataForm: {
        dutyName: "",
        dutyUnit: "",
        dutyUnitStr: [],
        dutyMemberStr: [],
        dutyMember: "",
        dutyMemberId: '',
      },
      rules: {
        dutyName: [{ required: true, message: "请输入", trigger: "blur" }],
        dutyUnitStr: [
          { required: true, message: "请选择", trigger: ["blur", "change"], },
          {
            validator: this.dutyUnitStr,
            trigger: 'change',
            type: 'array'
          }
        ],
        dutyMemberStr: [
          { required: true, message: "请选择", trigger: ["blur,change"], },
          {
            validator: this.dutyMemberStr,
            trigger: 'change',
            type: 'array'
          }
        ],
      },
    }
  }

方法

	//  单位的校验
    dutyUnitStr(rule, value, callback) {
      if (rule.type === 'array') {
        if (this.dataForm.dutyUnitStr.length < 1) {
          return callback(new Error('请选择'))
        } else {
          return callback();
        }
      } else {
        return callback();
      }
    },
    // 人员的校验
    dutyMemberStr(rule, value, callback) {
      if (rule.type === 'array') {
        if (this.dataForm.dutyMemberStr.length < 1) {
          return callback(new Error('请选择'))
        } else {
          return callback();
        }
      } else {
        return callback();
      }
    },
    changeOrganize(val, node) {
      this.dataForm.dutyUnitStr = val
      this.$forceUpdate()
      if (this.dataForm.dutyMemberStr) {
        this.dataForm.dutyMemberStr = []
        this.dataForm.dutyMember = ""
        this.dataForm.dutyMemberId = ''
      }
      this.disabledMan = true
      let arr = []
      this.dataForm.dutyUnit = val.join(',')
      node.forEach((item, index) => {
        arr.push(item.id)
      })
      this.getOptionData(arr)
    },
    clickMember(val, e) {
      let arr = []
      val.forEach(item => {
        this.dutyMemberOptions.forEach(ele => {
          if (item == ele.realName) {
            arr.push(ele.id)
          }
        })
      })
      this.dataForm.dutyMember = val.join(',')
      this.dataForm.dutyMemberId = arr.join(',')
      this.$forceUpdate() 
    },

其实要注意的地方主要就是对值的一个 深层校验页面的更新

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值