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="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标签,并进行展示,搜索,删除的更多相关文章
- element-- 修改MessageBox 弹框 中确定和取消按钮顺序
需求:修改弹框中的 取消/确定按钮顺序,及头部和底部背景颜色; 原ui效果图 需求ui效果图 方法:对取消及确定按钮自定义类名,样式重写
- 在弹框中获取foreach中遍历的id值,并传递给地址栏(方法2)
1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢.第二种方法. 2. 可以在弹框中给出一个input hidden 点击 ...
- 在弹框中获取foreach中遍历的id值,并传递给地址栏。
1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢. 2. 点击取现按钮,如果没有设置密码->弹框 3. 点击去设置 ...
- 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息
如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...
- layer.open弹框中的表单数据无法获取
layer.open弹框中的表单数据无法获取 表单数据模板 layer.open() 页面效果: 当点击确定后,radio和textarea获取的值总是为空,解决办法: var setPriCustB ...
- 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题
在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...
- 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。
创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...
- 在Vue中由后台数据循环生成多选框CheckBox时的注意事项
多选框是一种非常常见的功能,有时候我们会根据后台返回的数据进行多选框渲染,之前做项目时遇到循环生成多选框时,v-model绑定的值会随着选中与取消改变,但页面却不会变化 的情况,后来测试了一下,发现多 ...
- layer的iframe弹框中父子元素的传值
项目中,左侧导航树,右侧是 iframe 嵌套的页面,在右侧页面中又有layer弹框,可以说是有两层 iframe 框架. 所以查询网上的parent什么的方法都不能用.自己摸索的下面的方法: 1.父 ...
随机推荐
- optogenetics|
Bird &optogenetics&day&night 光遗传学(optogenetics)——结合遗传工程与光来操作个别神经细胞的活性,发现脑部如何产生γ波(gamma o ...
- Django正向解析和反向解析
转载:https://blog.csdn.net/jeekmary/article/details/79673867 先创建一个视图界面 urls.py index.html index页面加载的效果 ...
- JQuery中易混淆的概念
append(): 向每个匹配的元素内部追加内容. <p>I would like to say: </p> $("p").append("< ...
- Hello 2015
"Yeah It's on. " 前言 Hux 的 Blog 就这么开通了. 跳过废话,直接看技术实现 2015 年,Hux 总算有个地方可以好好写点东西了. 作为一个程序员, B ...
- LeetCode 刷题记录(1-5题)
1 两数之和(题目链接) class Solution: # 一次哈希法 def twoSum(self, nums, target): """ :type nums: ...
- 腾讯玩O2O手机维修 巨头入局引市场大变
巨头入局引市场大变" title="腾讯玩O2O手机维修 巨头入局引市场大变"> 对于"游击队"或初创企业来说,最怕的就是巨头的杀入. ...
- configure: error: C compiler cannot create executables报错处理
在测试环境安装php的imagick扩展在执行./configure生成编译文件时出现报错如下: 通过查看config.log发现有报错,在网上经验教程里发现前面的报错不管,直奔最后的报错即可,发现是 ...
- Python scan查找Redis集群中的key
import redis import sys from rediscluster import StrictRedisCluster #host = "172.17.155.118&quo ...
- 从社交到IP 庞大手游玩家大军迈向社群化之路
庞大手游玩家大军迈向社群化之路" title="从社交到IP 庞大手游玩家大军迈向社群化之路"> 移动互联网及相关智能设备的快速迭进,不仅改变了我们的生活方式,也彻 ...
- SpringBoot之SpringApplication
简介 可以用于从java主方法中引导和启动Spring应用程序的类,在默认情况下,通过以下步骤来启动应用: 创建一个ApplicationContext实例 注册CommandLineProperty ...