• 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;
        }
      }
    };

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

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

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

  • 相关阅读:
    怎么使用git来管理项目版本?
    《我的四季》 张浩
    [代码片段]读取BMP文件(二)
    [代码片段]读取BMP文件
    《构建之法》阅读笔记02
    二维数组
    学习进度二
    《构建之法》阅读笔记01
    数组
    软件工程第一周开课博客
  • 原文地址:https://www.cnblogs.com/dzlx/p/12530569.html
Copyright © 2020-2023  润新知