element-ui设置下拉框切换联动表单的必填和非必填,表单联想搜索功能实现

➢ 需求


image.png

1、节点类型下拉选择的时候
选择1,唯一识别码为必填,需要校验和显示*
选择其他的,唯一识别码不做校验,隐藏*
2、输入标准名称,标准名称联想搜索

上代码

 <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="95px" class="demo-ruleForm">
        <el-form-item label="节点类型" prop="code">
          <!-- <el-input v-model.trim="ruleForm.code" placeholder="请输入类型编码" /> -->
          <el-select v-model.trim="ruleForm.code" :disabled="ifDel" placeholder="请选择节点类型" clearable>
            <el-option
              v-for="(value,val) in codeList"
              :key="val"
              :label="val"
              :value="val"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="唯一识别码" :disabled="ifDel" :required="isHaveTo" prop="serverUrl">
          <el-input v-model.trim="ruleForm.serverUrl" placeholder="请输入唯一识别码" />
        </el-form-item>
      </el-form>

核心点

  • 在唯一识别码的form-item上,添加required属性绑定isHaveTo参数
    computed计算isHaveTo,根据节点类型下拉框选择的值来决定是为true还是false
 isHaveTo() {
        return this.ruleForm.code == '1';
    }
  • 在节点类型的校验函数中 ,判断当节点类型不为1的时候,移除对唯一识别码的校验

这步很重要,如果前面节点类型选择1,点击了确定按钮,触发了表单校验,当节点类型又改变了,不移除对唯一识别码的校验结果的话,唯一识别码只是会不显示*号,但是唯一识别码的红色提示还在

出现这种错误情况

image.png

移除校验结果后就没得问题了

 var validatePass2 = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('请选择节点类型'));
        } else {
            if(this.ruleForm.code != '1'){  // 移除校验结果  
                this.$refs.ruleForm.clearValidate('serverUrl');
            }
          callback();
        }
      };



完整代码 直接用~~~~ (欧里给!!)

<template>
  <div class="compareOrg">
    <el-dialog
      title="新增资源池"
      :visible.sync="dialogVisible"
      width="33%"
      :before-close="handleClose"
    >
      <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="95px" class="demo-ruleForm">
        <el-form-item label="标准名称" prop="name">
          <!-- <el-input v-model.trim="ruleForm.name" :disabled="ifDel" placeholder="请输入标准名称" /> -->
          <el-select
            v-model.trim="ruleForm.name"
            placeholder="请输入标准名称"
            filterable
            remote
            clearable
            :remote-method="remoteMethod"
            :loading="loading"
          >
            <el-option
              v-for="(item,val) in orgSelect"
              :key="val"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="节点类型" prop="code">
          <!-- <el-input v-model.trim="ruleForm.code" placeholder="请输入类型编码" /> -->
          <el-select v-model.trim="ruleForm.code"  placeholder="请选择节点类型" clearable>
            <el-option
              v-for="(value,val) in codeList"
              :key="val"
              :label="val"
              :value="val"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="唯一识别码" :required="isHaveTo"  prop="serverUrl">
          <el-input v-model.trim="ruleForm.serverUrl" placeholder="请输入唯一识别码" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="handleClose">取 消</el-button>
        <el-button type="primary" @click="handleSubmit">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
export default {
  data() {
    var validatePass = (rule, value, callback) => {
      if (this.ruleForm.code == '1') {
        callback(new Error('请输入唯一识别码'));
      } else {
        callback();
      }
    };
    var validatePass2 = (rule, value, callback) => {
      if (value === '') {
        callback(new Error('请选择节点类型'));
      } else {
        if (this.ruleForm.code != '1') { // 移除校验结果
          this.$refs.ruleForm.clearValidate('serverUrl');
        }
        callback();
      }
    };
    return {
      dialogVisible: false,
      ruleForm: {

      },
      rules: {
        name: [
          { required: true, message: '请输入标准名称', trigger: 'change' }
        ],
        code: [
          { required: true, message: '请选择节点类型', trigger: 'change' },
          { validator: validatePass2, trigger: 'change' }
        ],
        serverUrl: [
          { validator: validatePass, trigger: 'blur' }
        ]

      },
      orgSelect: [],
      loading: false,
      orgList: [
        { label: 11111111, value: 111111111 },
        { label: 11111111, value: 111111111 },
        { label: 11111111, value: 111111111 },
        { label: 11111111, value: 111111111 }
      ],
      codeList: [
        { val: 1 },
        { val: 2 },
        { val: 3 }
      ],

    }
  },
  computed: {
    isHaveTo() {
      return this.ruleForm.code == '1';
    }
  },
  methods: {
    debounce(fn, delay) {
      let timer = null // 借助闭包
      return function() {
        console.log('timer', timer)
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(fn, delay)
      }
    },
    searchFn(query) {
      this.loading = false;
      console.log('www', query)
      this.orgSelect = this.orgList.filter(item => {
        // console.log(item)
        return String(item.label).includes(query);
      });
    },
    remoteMethod(query) {  // 联想搜索功能
      // console.log('qqq',query)
      if (query !== '') {
        this.loading = true;
        // this.searchFn(query)
        // this.debounce(this.searchFn(query),1000)
        // let timer=null

        // console.log(90)
        // console.log(90,timer)

        // 防抖  每一次输入 延后两秒执行搜索
        if (timer) {
          clearTimeout(timer);
        }
        const timer = setTimeout(() => {
          this.loading = false;
          console.log('wwww', query)
          this.orgSelect = this.orgList.filter(item => {
            return String(item.label).includes(query);
          });
        }, 3000);

        // // 节流
        // if(flag){
        //     flag=false;
        // }else{
        //     flag=true;
        //     setTimeout(() => {
        //         this.loading = false;
        //         var flag=false
        //         console.log('wwww',query)
        //         this.orgSelect = this.orgList.filter(item => {
        //             return String(item.label).includes(query);
        //         });
        //     }, 3000);
        // }
      } else {
        this.orgSelect = [];
      }
    },
    handleClose() {
      this.resetForm();
      this.dialogVisible = false;
    },
    resetForm() {
      this.$refs['ruleForm'].resetFields();
    },
    openDialog(row) {
      this.dialogVisible = true
      this.row = row
    },
    handleSubmit() {
      this.$refs['ruleForm'].validate(valid => {
        if (valid) {
          // ...
          this.$emit('refresh', true);
        } else {
          console.log('error submit!!');
          return false;
        }
      });
    },
    handleDelete() {
      this.$confirm('确定要删除吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          //
          this.$emit('refresh', true);
        })
    }

  }
}
</script>
<style lang="scss" scoped>

</style>


最终效果
节点类型选择1的状态

image.png

选择1,并点击提交触发校验的状态
image.png

再把节点类型切换到其他的
image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容