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.父 ...
随机推荐
- SHELL用法二(练习)
1.SHELL编程作业&剖析演练 1)SHELL编程Nginx虚拟主机脚本: 安装Nginx WEB平台: 配置虚拟主机(1个网站): 重启&加载配置文件: 配置hos ...
- crack|erosion|strip|
V-ERG (使)破裂;(使)裂开;(使)断裂 If something hard cracks, or if you crack it, it becomes slightly damaged, w ...
- JS实现select去除option的使用注意事项
网上讲JS动态添加option和删除option的文章很多,在此推荐一篇: http://www.jb51.net/article/35205.htm 我使用的是如下方法: function remo ...
- 【待填坑】LG_4996_咕咕咕
正解思路和[AHOI]的中国象棋非常相似,同样是利用状态不一定一定要表示出来,利用组合数学递推节省枚举时间.
- JStorm:任务调度
前一篇文章 JStorm:概念与编程模型 介绍了JStorm的基本概念以及编程模型方面的知识,本篇主要介绍自己对JStorm的任务调度方面的认识,主要从三个方面介绍: 调度角色 调度方法 自定义调度 ...
- MyBatis之pageHelper分页插件
1.先导入Maven,jar包依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifa ...
- Windows 下 LaTeX 手动安装宏包(package)以及生成帮助文档的整套流程
本文简单介绍如何手动安装一个 LaTeX 宏包. 一般来说,下载的 TeX 发行版已经自带了很多宏包,可以满足绝大部分需求,但是偶尔我 们也可能碰到需要使用的宏包碰巧没有安装的情况,这时我们就需要自己 ...
- Koa 学习
中间件引擎 1234567891011121314151617181920212223242526272829303132333435363738 const Koa = require('koa') ...
- Jenkins+Git+Fastlane+Fir CI集成
上一篇有讲关于fastlane自动化部署,本篇将会着重讲关于fastlane的实际应用. 目标: 利用自动化jenkins打包工具,自动拉取git仓库代码 不需要通过手动检查修改xcode中项目配置修 ...
- iOS内存区域分布
概览 1,RAM ROM 2,内存的几大区域 3,案例解释 RAM ROM RAM:运行内存,不能掉电存储. ROM:存储性内存,可以掉电存储,例如内存卡.Flash. 内存的几大区域 为了合理的分配 ...