前几天遇到一个题,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="width: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;
}
}
};

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

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

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

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

  1. element-- 修改MessageBox 弹框 中确定和取消按钮顺序

    需求:修改弹框中的 取消/确定按钮顺序,及头部和底部背景颜色; 原ui效果图 需求ui效果图 方法:对取消及确定按钮自定义类名,样式重写

  2. 在弹框中获取foreach中遍历的id值,并传递给地址栏(方法2)

    1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢.第二种方法. 2. 可以在弹框中给出一个input hidden 点击 ...

  3. 在弹框中获取foreach中遍历的id值,并传递给地址栏。

    1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢. 2. 点击取现按钮,如果没有设置密码->弹框 3. 点击去设置 ...

  4. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...

  5. layer.open弹框中的表单数据无法获取

    layer.open弹框中的表单数据无法获取 表单数据模板 layer.open() 页面效果: 当点击确定后,radio和textarea获取的值总是为空,解决办法: var setPriCustB ...

  6. 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题

    在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...

  7. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  8. 在Vue中由后台数据循环生成多选框CheckBox时的注意事项

    多选框是一种非常常见的功能,有时候我们会根据后台返回的数据进行多选框渲染,之前做项目时遇到循环生成多选框时,v-model绑定的值会随着选中与取消改变,但页面却不会变化 的情况,后来测试了一下,发现多 ...

  9. layer的iframe弹框中父子元素的传值

    项目中,左侧导航树,右侧是 iframe 嵌套的页面,在右侧页面中又有layer弹框,可以说是有两层 iframe 框架. 所以查询网上的parent什么的方法都不能用.自己摸索的下面的方法: 1.父 ...

随机推荐

  1. 3DSMAX 卸载工具,完美彻底卸载清除干净3dsmax各种残留注册表和文件

    一些同学安装3dsmax出错了,也有时候想重新安装3dsmax的时候会出现这种本电脑已安装3dsmax,你要是不留意直接安装,只会安装3dsmax的附件,3dsmax是不会安装上的.这种原因呢就是大家 ...

  2. 深入 Java 调试体系: 第 1 部分,JPDA 体系概览

    JPDA 概述 所有的程序员都会遇到 bug,对于运行态的错误,我们往往需要一些方法来观察和测试运行态中的环境.在 Java 程序中,最简单的,您是否尝试过使用 System.out.println( ...

  3. RxJS学习笔记之Subject

    本文为原创文章,转载请标明出处 目录 Subject BehaviorSubject ReplaySubject AsyncSubject 1. Subject 总的来说,Subject 既是能够将值 ...

  4. from PIL import image报错

    python中import PIL可以,但是from PIL import Image就报错? ’‘ 大家在安装pillow的时候,可能会安装成功,但是当运行from pIL import image ...

  5. Shell的特殊字符

    # 有意义的“#”符合 echo ${PATH#*:} # 参数替换,不是一个注释 echo $(( 2#101011 )) # 进制转换,可以是任意进制,不是一个注释 “.” .字符匹配,这是作为正 ...

  6. Python 列表[::-1]翻转

    b = a[i:j:s]: i为起始索引(缺省为0), j为结束索引(不包括,缺省为len(a)), s为步进(缺省为1). 所以a[i:j:1]相当于a[i:j]. 当s<0时: i缺省时,默 ...

  7. 来自澳洲的数据秀场:记KDD 2015大会

    作者:微软亚洲研究院实习生 王英子 南半球最大城市和数据挖掘界顶级会议的浪漫碰撞 悉尼,作为澳大利亚第一大城市及新南威尔士州首府,澳大利亚的经济.金融.航运和旅游中心,同时还是南半球最大的城市和重要的 ...

  8. mysql 分表实现方法详解

    如果你需要进行mysql分表了我们就证明你数据库比较大了,就是把一张表分成N多个小表,分表后,单表的并发能力提高了,磁盘I/O性能也提高了.并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出 ...

  9. Channel Estimation for High Speed Wireless Systems using Gaussian Particle Filter and Auxiliary Particle Filter

    目录 论文来源 摘要 基本概念 1.时变信道 2.粒子滤波 3.高斯粒子滤波 4.辅助粒子滤波 比较 借鉴之处 论文来源 International Conference on Communicati ...

  10. datatables异步获取数据、简单实用

    IKC项目总结 一.认证难题管理模块 1. 如何使用datatables进行获取数据内容 datatables简介:Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何H ...