el-dialog对话弹框中根据后台数据无限制添加el-select标签,并进行展示,搜索,删除

前几天遇到一个题,el-dialog对话弹框中根据后台数据无限制添加el-select标签,并进行展示,搜索,删除,在这上面用到了递归算法,废话不多说,直接上代码

<template>
  <el-dialog top="2vh" title="资质选择" :visible.sync="dialogFormVisible" width="80%">
    <el-form :model="form">
      <div class="line">
        <el-form-item label="资质名称" :label-width="formLabelWidth">
          <div class="select-inline">
            <el-select
              size="small"
              value-key="id"
              @change="qualificationChange"
              v-model="form.selectArr[0]"
              placeholder="请选择"
              @click.native="changeIndex(0)"
            >
              <el-option
                v-for="item in qualifications"
                :key="item.id"
                :label="item.dname"
                :value="item"
              ></el-option>
            </el-select>
            <template v-for="(qitem,qkey) in qualificationsArr">
              <el-select
                @change="qualificationChange"
                value-key="id"
                size="small"
                :key="qkey"
                v-model="form.selectArr[qkey+1]"
                @click.native="changeIndex(qkey+1)"
              >
                <el-option label="全部" :value="{id:0}"></el-option>
                <el-option
                  v-for="qchildren in qitem"
                  :key="qchildren.id"
                  :label="qchildren.dname"
                  :value="qchildren"
                ></el-option>
              </el-select>
            </template>
          </div>
        </el-form-item>
        <el-form-item class="forms" label="资质条件" :label-width="formLabelWidth">
          <div class="qualification-condition">
            <div v-for="(citem,ckey) in  getCheckList" :key="ckey" class="condition-item">
              <div>{{ckey+1}}.{{citem.name}}</div>
              <div
                class="condition-item-children"
                v-for="(ichildren,ickey) in  citem.children"
                :key="ickey"
              >
                <div class="condition-item-name">{{ichildren.name}}</div>
                <div class="condition-item-delete" @click="deleteCheck(ichildren)">
                  <i class="el-icon-close"></i>
                </div>
              </div>
            </div>
          </div>
        </el-form-item>
      </div>
      <div class="lines">
      <el-form-item label="列表筛选" :label-width="formLabelWidth">
        <el-input style="20%;" v-model="searchKeyword" placeholder="找不到?搜一下吧"></el-input>
        <div class="q-list">
          <template v-for="(qitem,qkey) in  getFilterList">
            <el-checkbox
              style="margin:0 0 0 20px"
              @change="(val)=>checkBoxChange(val,qitem)"
              :key="qkey"
              v-model="qitem.checked"
            >{{qitem.name}}</el-checkbox>
          </template>
        </div>
      </el-form-item>
      </div>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button type="primary" @click="search">搜索</el-button>
      <el-button @click="clearAll">清空</el-button>
    </div>
  </el-dialog>
</template>

下面就是script部分

import axios from "axios";
export default {
  data() {
    return {
      searchKeyword: "",
      dialogFormVisible: true,
      qualifications: [], //资质
      qualificationsArr: [],
      qualificationList: [], //资质列表
      formLabelWidth: "70px",
      index: 0,
      form: {
        selectArr: [{}]
      },
      checkList: []
    };
  },
  created() {
    var params = new URLSearchParams();
    params.append(
      "token",
      "4b68KDt5yOIvnNYPniwP78Qc9ho0i1U2y86kebxC1OYpqI5r5LQh7CE50hVUVXlg47Ze6IN7d7jOkRKBH3cgRCPA5ixmzyJwAm8PAw"
    ); //传给后台的参数值 key/value
    params.append("login_company_id", 0);
    params.append("login_user_id", 496);
    axios({
      method: "post",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      url:
        "http://115.28.156.246/BuildBidNew/public/index.php/firm/Firm_search/getQualiDict",
      data: params
    }).then(({ data }) => {
      if (data.status == "success") {
        this.qualifications = data.rows;
      } else {
        this.$message.error("出现错误");
      }
    });
  },
  methods: {
    clearAll() {
      this.qualificationsArr = [];
      this.qualificationList = [];
      this.checkList = [];
      this.form.selectArr = [];
      this.index = 0;
      this.searchKeyword = "";
    },
    //删除已选中的
    deleteCheck(item) {
      this.qualificationList.find((value, key) => {
        if (value.id == item.id) {
          item.checked = false;
          this.$set(this.qualificationList, key, item);
          return true;
        }
      });

      this.checkList.find((val1, key1) => {
        if (val1.id == item.id) {
          this.checkList.splice(key1, 1);
          return true;
        }
      });
    },
    checkBoxChange(val, item) {
      //刷新界面
      this.qualificationList.find((value, key) => {
        if (value.id == item.id) {
          item.checked = val;
          this.$set(this.qualificationList, key, item);
          return true;
        }
      });
      //使用新数组存选择结果
      if (
        !this.checkList.find((val1, key1) => {
          if (val1.id == item.id) {
            this.checkList.splice(key1, 1);
            return true;
          }
        })
      ) {
        this.checkList.push(item);
      }
    },
    changeIndex(index) {
      this.index = index;
    },
    qualificationChange(item) {
      //删除更改后面的
      this.form.selectArr.splice(this.index + 1);
      this.qualificationsArr.splice(this.index);
      if (item.children && item.children.length > 0) {
        if (item.children[0].last == 0) {
          this.form.selectArr.push({ id: 0 });
          this.qualificationsArr.push(item.children);
        }
      }
      this.generateList();
    },
    //生成列表
    generateList() {
      let preStr = "";
      for (let item of this.form.selectArr) {
        if (item.dname) {
          preStr += item.dname + " / ";
        }
      }
      this.qualificationList = [];

      if (this.form.selectArr[this.form.selectArr.length - 1].dname) {
        this.getList(
          preStr,
          this.form.selectArr[this.form.selectArr.length - 1]
        );
      } else {
        this.getList(
          preStr,
          this.form.selectArr[this.form.selectArr.length - 2]
        );
      }
    },
    getList(preStr, item) {
      for (let citem of item.children) {
        if (citem.children) {
          this.getList(preStr + citem.dname + " / ", citem);
        } else {
          let checked = this.checkList.find(val => {
            return val.id == citem.id;
          });
          if (checked) {
            citem.checked = true;
          } else {
            citem.checked = false;
          }
          citem.name = preStr + citem.dname;
          this.qualificationList.push(citem);
        }
      }
    },
    //搜索回调
    search() {
      this.$emit("on-search", this.checkList);
    }
  },
  computed: {
    //根据搜索内容筛选
    getFilterList() {
      let reg = new RegExp(".*" + this.searchKeyword + ".*");
      return this.qualificationList.filter(val => {
        return reg.test(val.name);
      });
    },
    //获取选中的内容
    getCheckList() {
      let checkData = this.checkList.filter(val => {
        return val.checked;
      });
      let arr = [];
      for (let item of checkData) {
        //得到一级
        let match = /^(.*?)[s]//.exec(item.name);
        let fname = match[1];
        //查找是否有相同一级
        let arrItem = arr.find(val => {
          return val.name == fname;
        });
        if (arrItem) {
          arrItem.children.push(item);
        } else {
          arr.push({ name: fname, children: [item] });
        }
      }
      return arr;
    }
  }
};

样式部分可随自己的想的写,这里就不写出来了

写出了结果大概就是这样:

 不喜勿喷,,有需要完善的地方还请指教

原文地址:https://www.cnblogs.com/dzlx/p/12530569.html