VUE+ElementUI实现左侧为树形结构、右侧无层级结构的穿梭框
工作中遇到一个需求,需要将一个数据选择做成穿梭框,但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示,ElementUI自身无法在穿梭框中添加树形结构,网上搜到了大佬封装的插件但是对于右侧的无树形结构一点还是不太满足,于是自己基于ElementUI和VUE2.X做了一个小组件,优化的地方还很多,但是能够基本满足业务需求,后面有时间也会努力去改的更加灵活。我是新手程序员,大佬们看到了有什么可以优化的地方希望能够指正。
<template>
<!-- 自定义树形穿梭框组件、理论上左右均可选择是否为树形结构,目前固定为左侧树形、右侧无层级结构 -->
<div class="tree-transfer">
<!-- 穿梭框左侧 -->
<div class="tree-transfer-left">
<!-- 左侧采用element-ui的el-tree -->
<el-tree
ref="treeLeft"
:data="dataLeft"
show-checkbox
node-key="id"
:props="defaultProps">
</el-tree>
</div>
<!-- 穿梭框中间按钮区域 -->
<div class="tree-transfer-middle">
<el-button circle type="info" icon="el-icon-arrow-left" @click="remove"></el-button>
<el-button circle type="info" icon="el-icon-arrow-right" @click="add"></el-button>
</div>
<!-- 穿梭框右侧 -->
<div class="tree-transfer-right">
<!-- 右侧直接放置结果 -->
<!-- 这里也采用tree结构,默认是对数据进行处理使得没有树形结构,也可以选择有树形结构 -->
<el-tree
ref="treeRight"
:data="dataRight"
show-checkbox
node-key="id"
:props="defaultProps">
</el-tree>
</div>
</div>
</template> <script>
export default{
props:['datas','defaultProps'],
data(){
return{
yuansiData:[],
dataLeft:[],
dataRight:[]
}
},
mounted() {
console.log(this.datas)
this.dataLeft = this.datas
this.yuansiData = JSON.parse(JSON.stringify(this.datas))
},
methods:{
add(){
// 定义一个递归过滤的方法,用来删掉父级中给的元素
// 获取所有选中的项并且去掉父级
let list = this.$refs.treeLeft.getCheckedNodes()
// 走原始数据中删掉已经选择的
// 1.父级的删除
const parList = list.filter(item=>{
return item.parameterInfoList
})
for(let item1 of parList){
let index = this.dataLeft.findIndex(item2=>{
return item2.id == item1.id
})
if(index>=0){
this.dataLeft.splice(index,1)
}
}
// 2.子级的删除
list = list.filter((item=>{
return !item.parameterInfoList
}))
// 这里做了三重循环,如果有可能需要对其进行优化
for(let item of list){
for(let ind in this.dataLeft){
if(this.dataLeft[ind].parameterInfoList.length){
let index = this.dataLeft[ind].parameterInfoList.findIndex(item2=>{
return item2.id == item.id
})
if(index>=0){
this.dataLeft[ind].parameterInfoList.splice(index,1)
}
}
}
}
this.$refs.treeLeft.setCheckedNodes([])
// 将选择的项添加到右侧
this.dataRight.push(...list)
},
remove(){
// 从右侧移除时的方法
// 1.从右侧删除选中的数据
let list = this.$refs.treeRight.getCheckedNodes()
for(let item of list){
let index = this.dataRight.findIndex(item2=>{
return item.id == item2.id
})
if(index>=0){
this.dataRight.splice(index,1)
}
}
// 2.把右侧删除的数据添加给左侧,但是要注意父级的问题
this.dataLeft = JSON.parse(JSON.stringify(this.yuansiData))
for(let index in this.dataLeft){
// 如果有子级去删除子级
for(let item of this.dataRight){
let ind = this.dataLeft[index].parameterInfoList.findIndex(item2=>{
return item2.id == item.id
})
if(ind>=0){
this.dataLeft[index].parameterInfoList.splice(ind,1)
}
}
this.dataLeft = this.dataLeft.filter(item2=>{
return item2.parameterInfoList.length!=0
})
}
},
getResult(){
return this.dataRight
}
}
}
</script> <style scoped lang="less">
.tree-transfer{
display: flex;
min-height: 250px;
.tree-transfer-left{
min-width: 200px;
border:1px #E5E5E5 solid;
border-radius: 10px;
padding: 10px;
}
.tree-transfer-middle{
display: flex;
justify-content: center;
align-items: center;
min-width: 120px;
}
.tree-transfer-right{
min-width: 200px;
border:1px #E5E5E5 solid;
border-radius: 10px;
padding: 10px;
}
}
</style>
父组件需要传递带层级结构的datas,和ElementUI中tree的props。
这里使用的datas中的唯一标识是id,子元素放在parameterInfoList字段中。
defaultProps: {
children: 'parameterInfoList',
label: 'name'
}
VUE+ElementUI实现左侧为树形结构、右侧无层级结构的穿梭框的更多相关文章
- vue Element-ui el-menu 左侧导航条
<template> <!--实现左侧导航条动态渲染(三级)--> <el-menu class="el-menu-vertical-demo" @o ...
- 网页html结构右侧栏固定,左侧自适应大小。
最近写了一个项目,写页面的结构,html树形结构是有header,container,footer部分,其中container部分是右侧栏是固定宽度,左侧是自适应宽度与屏幕高度. 第一次写的博客文章是 ...
- vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解
做后端管理系统,永远是最蛋疼.最复杂也最欠揍的事情,也永远是前端开发人员最苦逼.最无奈也最尿性的时刻.蛋疼的是需求变幻无穷,如同二师兄的三十六般变化:复杂的是开发难度寸步难行,如同蜀道难,难于上青天: ...
- 【vue系列】elementUI 穿梭框右侧获取当前选中项的值的思路
最近 做了一个需求 在查询结果的表格中,选取(可多选)一些值,获取到保单号后,打开一个elementUI的穿梭框,然后获取到所有业务员,选取一些业务员后,将上一步获取到的保单号传递给业务员. 画个示意 ...
- spring boot + vue + element-ui全栈开发入门——前端列表页面开发
一.页面 1.布局 假设,我们要开发一个会员列表的页面. 首先,添加vue页面文件“src\pages\Member.vue” 参照文档http://element.eleme.io/#/zh-CN ...
- spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发
前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...
- 保姆级别的vue + ElementUI 搭建后台管理系统教程
vue + ElementUI 搭建后台管理系统记录 本文档记录了该系统从零配置的完整过程 项目源码请访问:https://gitee.com/szxio/vue2Admin,如果感觉对你有帮助,请点 ...
- spring boot + vue + element-ui全栈开发入门——开篇
最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...
- 递归函数 Vue ElementUI
对树形菜单的递归操作,首先应该对树形菜单数据进行整理,优化成自己需要的类型 比如Vue + ElementUI的动态侧边栏数据 export function routerRoleToPretty ( ...
随机推荐
- 微信架构 & 支付架构(上)
微信架构 & 支付架构(上) 一. 微信和支付宝对比 这两者现在已经占领了移动支付的90%市场,支付形式也都大抵相同,只是在实现细节上略微不同.这里之所以要专门对比,是因为有些接口的不同在后边 ...
- YOLO3升级优化版!Poly-YOLO:支持实例分割!
YOLO3升级优化版!Poly-YOLO:支持实例分割! POLY-YOLO: HIGHER SPEED, MORE PRECISE DETECTION AND INSTANCE SEGMENTATI ...
- Java基础知识之this关键字知识讲解
this关键字这里对java中this关键字的基础知识进行讲解,希望对热爱java的小伙伴有帮助!! /* this关键字代表了所属函数的调用者对象. this关键字的作用: 1. 如果存在同名成员变 ...
- 「题解」POI2005 AKC-Special Forces Manoeuvres
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P3428.官网. 题意简述 给定 \(n\) 个圆 \((x_i,y_i,r_i)\),每个圆对应一个点集 \(S ...
- Centos7 安装 Zabbix Server 4.0
官方参考URL:https://www.zabbix.com/documentation/4.0/start 1. 安装 Apache 2.4(略) 注意系统时间/时区ntp server是否定时同步 ...
- ElGamal算法
简介 ElGamal算法可以用于加密和签名,其安全性依赖于计算有限域上离散对数的难度. ElGamal密钥 生成密钥对时,首先选择素数p,两个随机数g和x,g和x都小于p,然后计算: y = g ^ ...
- PTA7~9题目集总结与归纳
前言: 总结三次题目集的知识点.题量.难度等情况. 目录: 题目集7(7-1).(7-2)两道题目的递进式设计分析总结 题目集8和题目集9两道ATM机仿真题目的设计思路分析总结 一. 题目集7(7-1 ...
- 别再说Java对象都是在堆内存上分配空间的了!
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解.可以说,关于JVM的相关知识,基本是每个Java开发者 ...
- 关于MySQL索引面试题的六连炮!招架的住吗?
1.面试真题 MySQ索引的原理和数据结构能介绍一下吗? b+树和b-树有什么区别? MySQL聚簇索引和非聚簇索引的区别是什么? 他们分别是如何存储的? 使用MySQL索引都有哪些原则? MySQL ...
- .NET Core/.NET5/.NET6 开源项目汇总4:CMS、Blog项目
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...