下拉多选框、带搜索、带条件互斥逻辑判断组件

如图效果,多选下拉框,可搜索下拉内容进行选择,一组选择后,其他组再选,之前的选项置灰(也就是说,每个选项只能被选一次。)

上代码:

html:

复制代码
 <el-dialog
      title="编辑"
      :visible.sync="dialogVisible"
      append-to-body
      width="540px"
      ref="ruleForm"
      @open="handleOpen"
      @close="hanldClose"
    >
      <el-form ref="ruleForm">
        <el-form-item label="日期" prop="materialWarehouseId">
          <el-input v-model="ruleForm.dutyDateStr" disabled></el-input>
        </el-form-item>
        <el-form-item label="带班领导" prop="shiftLeaderUseridsList">
          <el-select
            placeholder="请选择带班领导"
            v-model="ruleForm.shiftLeaderUseridsList"
            collapse-tags
            :remote="false"
            :multiple="!single"
            :filterable="single"
            clearable
            @clear="clearHandle"
            @visible-change="blurHandle('带班领导')"
          >
            <div class="inputBox" v-if="!single">
              <el-input
                v-model="filterQuery"
                @input="filterMethodThrottle($event)"
              ></el-input>
            </div>
            <template v-for="item in orgPersonList">
              <el-option
                :key="item.id"
                :label="item.realName + '  ' + item.telPhone"
                :value="item.id"
                :disabled="item.disabled"
                v-show="item.isShow"
              >
              </el-option>
            </template>
          </el-select>
        </el-form-item>

        <el-form-item label="值班科长" prop="dutySectionChiefUseridsList">
          <el-select
            placeholder="请选择值班科长"
            v-model="ruleForm.dutySectionChiefUseridsList"
            collapse-tags
            :remote="false"
            :multiple="!single"
            :filterable="single"
            clearable
            @clear="clearHandle"
            @visible-change="blurHandle('值班科长')"
          >
            <div class="inputBox" v-if="!single">
              <el-input
                v-model="filterQuery"
                @input="filterMethodThrottle($event)"
              ></el-input>
            </div>
            <template v-for="item in orgPersonList">
              <el-option
                :key="item.id"
                :label="item.realName + '  ' + item.telPhone"
                :value="item.id"
                :disabled="item.disabled"
                v-show="item.isShow"
              >
              </el-option>
            </template>
          </el-select>
        </el-form-item>
        <el-form-item label="值班人员" prop="personnelOnDutyUseridsList">
          <el-select
            placeholder="请选择值班人员"
            v-model="ruleForm.personnelOnDutyUseridsList"
            collapse-tags
            :remote="false"
            :multiple="!single"
            :filterable="single"
            clearable
            @clear="clearHandle"
            @visible-change="blurHandle('值班人员')"
          >
            <div class="inputBox" v-if="!single">
              <el-input
                v-model="filterQuery"
                @input="filterMethodThrottle($event)"
              ></el-input>
            </div>
            <template v-for="item in orgPersonList">
              <el-option
                :key="item.id"
                :label="item.realName + '  ' + item.telPhone"
                :value="item.id"
                :disabled="item.disabled"
                v-show="item.isShow"
              >
              </el-option>
            </template>
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false" size="small">取消</el-button>
        <el-button @click="submitFn" size="small" type="info">确认</el-button>
      </span>
    </el-dialog>
复制代码

js:

复制代码

props: {
    itemId: {
      require: true,
      type: Number
    },
    kindId: {
      require: true,
      type: String
    }
  },

data() {
return { dialogVisible: false, ruleForm: { dutyDateStr: null, //日期 shiftLeaderUseridsList: [], //带班领导 dutySectionChiefUseridsList: [], //值班科长 personnelOnDutyUseridsList: [] //值班人员 }, single: false, filterQuery: '', orgPersonList: [] //机构联系人 }; }, methods: { // 获取机构联系人表列表 getorgPersonFn() { let data = { orgId: this.kindId }; getOrgPersonApi(data).then(res => { if (res.data.code === 200) { this.orgPersonList = res.data.data; this.getDetailFn(); } }); }, //下拉关闭 blurHandle(status) { this.filterQuery = ''; if (status == '带班领导') { this.orgPersonList.forEach(val => { this.$set(val, 'disabled', false); this.$set(val, 'isShow', true); this.ruleForm.dutySectionChiefUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); this.ruleForm.personnelOnDutyUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); }); } else if (status == '值班科长') { this.orgPersonList.forEach(val => { this.$set(val, 'disabled', false); this.$set(val, 'isShow', true); this.ruleForm.shiftLeaderUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); this.ruleForm.personnelOnDutyUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); }); } else if (status == '值班人员') { this.orgPersonList.forEach(val => { this.$set(val, 'disabled', false); //这里使用$set方法 解决无法更新数据问题 this.$set(val, 'isShow', true); this.ruleForm.dutySectionChiefUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); this.ruleForm.shiftLeaderUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); }); } }, //获取详情 getDetailFn() { getDetailApi(this.itemId).then(res => { if (res.data.code == 200) { this.ruleForm.dutyDateStr = res.data.data.dutyDateStr; this.ruleForm.dutySectionChiefUseridsList = res.data.data .dutySectionChiefUseridList ? res.data.data.dutySectionChiefUseridList : []; this.ruleForm.shiftLeaderUseridsList = res.data.data .shiftLeaderUseridList ? res.data.data.shiftLeaderUseridList : []; this.ruleForm.personnelOnDutyUseridsList = res.data.data .personnelOnDutyUseridList ? res.data.data.personnelOnDutyUseridList : []; this.orgPersonList.forEach(val => { this.$set(val, 'disabled', false); this.$set(val, 'isShow', true); this.ruleForm.dutySectionChiefUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); this.ruleForm.shiftLeaderUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); this.ruleForm.personnelOnDutyUseridsList.forEach(v => { if (val.id == v) { this.$set(val, 'disabled', true); } }); }); } }); }, // 提交 submitFn() { let data = { id: this.itemId, dutySectionChiefUseridsList: this.ruleForm.dutySectionChiefUseridsList, shiftLeaderUseridsList: this.ruleForm.shiftLeaderUseridsList, personnelOnDutyUseridsList: this.ruleForm.personnelOnDutyUseridsList }; console.log(data, 'daraaaaaaaa'); editApi(data).then(res => { if (res.data.code === 200) { if (res.data.data) { this.dialogVisible = false; this.$emit('refresh'); this.$message({ type: 'success', message: '编辑成功' }); } else { this.$message({ message: '请勿重复添加!', type: 'warning' }); } } }); }, //下拉的搜索 filterMethodThrottle(word) { this.orgPersonList.forEach(val => { if (word == '') { val.isShow = true; } else { val.isShow = false; if (val.realName.indexOf(word) != -1) { val.isShow = true; } } }); }, //清除选中的项 clearHandle(item) { console.log(item, '清除的'); }, //打开弹窗 handleOpen() { this.getorgPersonFn(); }, //关闭弹窗 hanldClose() {} }
复制代码

样式:

复制代码
<style lang="scss" scoped>
.el-select {
  width: 100%;
}
.form-tips-color {
  font-size: 10px;
  font-family: Microsoft YaHei;
  font-weight: 400;
  color: #f57171;
  position: absolute;
  top: 129%;
  left: 0;
}
.form-tips {
  font-size: 10px;
  font-family: Microsoft YaHei;
  font-weight: 400;
  color: #a4a5d3;
  padding-left: 100px;
  box-sizing: border-box;
}

/deep/ .el-input.is-disabled .el-input__inner {
  color: #a4a5d3;
}
/deep/ .el-dialog {
  .el-form-item__label {
    width: 100px;
  }
}
.inputBox {
  /deep/ .el-input__inner {
    width: calc(100% - 40px);
    margin: 0 20px 10px;
    padding-right: 30px;
    box-sizing: border-box;
    background: #3c3e74 !important;
    border: 1px solid #31337c;
    border-radius: 6px;
    color: #fff;
  }
}
</style>
复制代码

 

posted @   如意酱  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示