element-ui自制树形穿梭框

1、需求

由于业务特殊需求,想要element穿梭框功能,数据是二级树形结构,选中左边数据穿梭到右边后,左边数据不变。多次选中左边相同数据进行穿梭操作,右边数据会多次增加相同的数据。右边数据穿梭回左边时,右边数据会减少,左边数据仍然保持不变。总的来说就是左边数据一直保持不变,右边数据会随着穿梭操作增加或减少,相同数据可以多次添加。(这个需求太特殊了,没办法用组件tree-transfer实现,于是自制了树形穿梭框,记录一下)

2、上代码

 <template><el-dialog title="数据选择" :visible.sync="TransferTreeBoxShow"  width="1500px"  :before-close="handleClose"><div class="TransferTreeBox"><div class="leftSelect"><!-- 左侧待选内容 --><div class="SelectBox"><div class="boxTitle">X轴待选 </div><div class="boxCenter"><el-treeref="beforeTree":data="fromData":props="defaultProps"show-checkbox:filter-node-method="beforeFilterNode":accordion="true"node-key="id"/></div></div><!-- 中间穿梭按钮 --><div class="transferBtn"><div class="pickBtn" @click="towardsRight">&gt;&gt;</div><div class="pickBtn" @click="towardsLeft">&lt;&lt;</div></div><!-- 右侧已选内容 --><div class="SelectBox"><div class="boxTitle">X轴已选</div><div class="boxCenter"><el-treeref="afterTree":data="fromData2":props="defaultProps"show-checkbox:filter-node-method="afterFilterNode"node-key="id"/></div></div></div></div>
</el-dialog></template><script>
export default {data () {return {TransferTreeBoxShow:false,defaultProps: {children: "children",label: "label"},beforeKeyarr: [],afterKeyarr: [],fromData2:[],fromData: [{"id": "1","pid": "0","label": "一级","children": [{"id": "1-1","pid": "1","label": "1-1级","children": []},{"id": "1-2","pid": "1","label": "1-2级","children": []},{"id": "1-3","pid": "1","label": "1-3级","children": []},{"id": "1-4","pid": "1","label": "1-4级","children": []},{"id": "1-5","pid": "1","label": "1-5级","children": []}]},{"id": "2","pid": "0","label": "二级","children": [{"id": "2-1","pid": "2","label": "2-1级","children": []},{"id": "2-2","pid": "2","label": "2-2级","children": []},{"id": "2-3","pid": "2","label": "2-3级","children": []}]},{"id": "3","pid": "0","label": "三级","children": [{"id": "3-1","pid": "3","label": "3-1级","children": []},{"id": "3-2","pid": "3","label": "3-2级","children": []},{"id": "3-3","pid": "3","label": "3-3级","children": []},{"id": "3-4","pid": "3","label": "3-4级","children": []},{"id": "3-5","pid": "3","label": "3-5级","children": []},{"id": "3-6","pid": "3","label": "3-6级","children": []},{"id": "3-7","pid": "3","label": "3-7级","children": []}]}]};},methods: {handleClose(done) {this.$confirm("确认关闭?").then((_) => {done();}).catch((_) => { });},// 点击向右穿梭towardsRight(){let currentBeforeKeyarr = this.$refs.beforeTree.getCheckedNodes(true);for(var i=0;i<currentBeforeKeyarr.length;i++){for(var j=0;j<this.fromData.length;j++){var children=this.fromData[j].children;if(children.length>0){if(children.includes(currentBeforeKeyarr[i])){var father=this.fromData[j];var index=-1;for(var k=0;k<this.fromData2.length;k++){if(father.id==this.fromData2[k].id){index=k;break;}}if(index!=-1){var childrenOld=this.fromData2[index].children;var child={id:Math.random(),label:currentBeforeKeyarr[i].label,pid:currentBeforeKeyarr[i].pid,children:[]} childrenOld.push(child);var newChildren=[];newChildren=newChildren.concat(childrenOld)this.fromData2[index].children=newChildren;}else{var newFather={id:father.id,label:father.label,pid:father.pid,children:[]}    newFather.children.push(currentBeforeKeyarr[i]);this.fromData2.push(newFather);}break;}                   }}}},// 点击向左穿梭towardsLeft(){this.afterKeyarr = this.$refs.afterTree.getCheckedNodes(true);for(var i=0;i<this.afterKeyarr.length;i++){for(var j=0;j<this.fromData2.length;j++){var children=this.fromData2[j].children;for(var k=0;k<children.length;k++){if(this.afterKeyarr[i].id==children[k].id){children.splice(k, 1);k--;break;}}if(children.length==0){this.fromData2.splice(j, 1);j--;}}}},// 过滤beforeFilterNode(value, data) {if (!value) {return true;}return value.indexOf(data.id) < 0;},afterFilterNode(value, data){if (!value) {return false;}return value.indexOf(data.value) !== -1;},}
};
</script><style lang="scss" scoped>.TransferTreeBox  .SelectBox{border: 1px solid #ccc;height: 100%;width: 40%;color: #fff;position: relative;
}
.TransferTreeBox  .SelectBox        .boxTitle{background: #a0cfff;height: 30px;line-height: 30px;text-align: center;border-bottom: 1px solid #ccc;}.TransferTreeBox  .SelectBox       .boxCenter{height: 100%;width: 100%;max-height: 508px;overflow-y: scroll;}.TransferTreeBox .transferBtn{position: relative;display: flex;flex-direction: column;align-items: center;justify-content: center;width: 20%;}.TransferTreeBox .transferBtn  .pickBtn{height: 30px;width: 50px;background: #a0cfff;color: #fff;font-weight: 700;font-size: 20px;border-radius: 5px;margin-top: 10px;text-align: center;line-height: 30px;cursor: pointer;}/deep/.TransferTreeBox .boxTitle {color: #77F7FF;background-color: #021F99; /* 深蓝背景 */
}/deep/.TransferTreeBox .SelectBox .boxTitle {color: #77F7FF;/* background-color: #021F99; 深蓝背景 */background-color: rgba(0, 0, 0, 0); /*透明背景 */
}
/deep/.TransferTreeBox .el-tree-node__content{color: #77F7FF;background-color: #021F99; /* 深蓝背景 */
}
/deep/.TransferTreeBox .el-tree__empty-block{color: #77F7FF;background-color: #021F99; /* 深蓝背景 */
}
/deep/.TransferTreeBox .el-tree__empty-text{color: #5378F5;
}.TransferTreeBox {height: 600px;color: #FFFFFF !important;font-size: 20px;width: 100%;display: flex;flex-wrap: wrap;
}/deep/ .el-dialog {background: transparent;background-image: url("../../assets/boardback.png");background-size: cover;
}
/deep/ .el-dialog__title {color: #fff;
}
/deep/ .el-dialog__headerbtn .el-dialog__close {color: #fff;
}
.rightSelect{width: 48%;height: 90%;display: flex;flex-wrap: wrap;margin-left:3%;
}
.leftSelect{width: 48%;height: 90%;display: flex;flex-wrap: wrap;
}.TransferTreeBox .Correlation-bottom{margin-top:2%;width: 100%;height: 10%;margin-left: 44%;
}</style>

3、效果图

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a5bd057007dd4b68847a27c8dac2cfa0.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPS宏开发手册——Excel实战

目录 系列文章5、Excel实战使用for循环给10*10的表格填充行列之和使用for循环将10*10表格中的偶数值提取到另一个sheet页使用for循环给写一个99乘法表按市场成员名称分类&#xff08;即市场成员A、B、C...&#xff09;&#xff0c;统计月内不同时间段表1和表2的乘积之和&#x…

计算机网络-TCP的流量控制

内容来源&#xff1a;小林coding 本文是对小林coding的TPC流量控制的精简总结 什么是流量控制 发送方不能无脑的发数据给接收方&#xff0c;要考虑接收方处理能力 如果一直无脑的发数据给对方&#xff0c;但对方处理不过来&#xff0c;那么就会导致触发重发机制 从而导致网…

Spring Boot 七种事务传播行为只有 REQUIRES_NEW 和 NESTED 支持部分回滚的分析

Spring Boot 七种事务传播行为支持部分回滚的分析 支持部分回滚的传播行为 REQUIRES_NEW&#xff1a;始终开启新事务&#xff0c;独立于外部事务&#xff0c;失败时仅自身回滚。NESTED&#xff1a;在当前事务中创建保存点&#xff08;Savepoint&#xff09;&#xff0c;可局部…

突破反爬困境:SDK开发,浏览器模块(七)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的&#xff0c;旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…

C++数据排序( 附源码 )

一.冒泡排序 原理:自左向右依次遍历,若相邻两数顺序错误,则交换两数. 这样,每一轮结束后,最大/最小的数就会到最后. Code: #include <iostream> #include <cstdio> using namespace std; const int N1e51; int n,a[N],in; void PrintArray(int a[],int n){for…

I2C 读写 AT24C02

根据AT24C02的 Datasheet 可知AT24C02有2K bit&#xff0c;即256B&#xff0c;分为32页,每页8个字节&#xff0c;结合数据手册和原理图可以得知&#xff0c;板载AT24C02的读地址为0xA2&#xff0c;写地址为0xA3&#xff1a; #define AT24C02_ADDR_WRITE 0xA2 #define AT24C02_…

K8S学习之基础七十四:部署在线书店bookinfo

部署在线书店bookinfo 在线书店-bookinfo 该应用由四个单独的微服务构成&#xff0c;这个应用模仿在线书店的一个分类&#xff0c;显示一本书的信息&#xff0c;页面上会显示一本书的描述&#xff0c;书籍的细节&#xff08;ISBN、页数等&#xff09;&#xff0c;以及关于这本…

Linux 查找文本中控制字符所在的行

参考资料 ASCIIコード表 目录 一. 业务背景二. 遇到的问题三. 分析3.1 url编码的前置知识3.2 出现控制字符的transactionid分析3.3 16进制分析 四. 从文本中查找控制字符所在的行五. 控制字符一览 一. 业务背景 ⏹在项目中&#xff0c;业务请求对应着下URL http://www.test.…

python将pdf文件转为图片,如果pdf文件包含多页,将转化的多个图片通过垂直或者水平合并成一张图片

要将PDF文件转换为图片&#xff0c;并将多页PDF垂直合并成一张图片&#xff0c;可以使用PyMuPDF&#xff08;也称为fitz&#xff09;库来读取PDF文件&#xff0c;并使用Pillow库来处理和合并图片。以下是一个示例代码&#xff0c;展示了如何实现这个功能&#xff1a; 首先&…

HarmonyOS 基础组件和基础布局的介绍

1. HarmonyOS 基础组件 1.1 Text 文本组件 Text(this.message)//文本内容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字体大小.maxLines(1)// 最大行数.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出显示....fontColor(Color.Black).…

FrameWork基础案例解析(四)

文章目录 单独拉取framework开机与开机动画横屏Android.mk语法单独编译SDKmake 忽略warning单独修改和编译Camera2单独编译Launcher3Android Studio 导入、修改、编译Settings导入 Android Studio 导入、修改、编译Launcher3android 开机默认进入指定Launcher植入自己的apk到系…

基于vscode(GDB)调试ros2节点

一、环境准备 必备vscode插件 1&#xff09;Docker Docker - Visual Studio Marketplace 2&#xff09;Dev Containers Dev Containers - Visual Studio Marketplace 3&#xff09;GDB GDB Debug - Visual Studio Marketplace 二、进去docker镜像 1&#xff09;docker安…

基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展&#xff0c;我们国家和世界都已经进入了互联网大数据时代&#xff0c;计算机网络已经成为了整个社会以及经济发展的巨大动能&#xff0c;考研成绩查询管理事务现在已经成为社会关注的重要内容&#xff0c;因此运用互联网技术来提高考研成绩…

C++:算术运算符

程序员Amin &#x1f648;作者简介&#xff1a;练习时长两年半&#xff0c;全栈up主 &#x1f649;个人主页&#xff1a;程序员Amin &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全…

PyQt6实例_A股日数据维护工具_使用

目录 前置&#xff1a; 下载预备更新的数据 使用工具更新 用工具下载未复权、前复权、权息数据 在PostgreSQL添加两个数据表 工具&视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_A股日数据维护工具” 开头放置在“PyQt6实例”专栏 2 日数据可在“数据库”专栏&…

REST 方法

FUNCTION ZFM_INTERFACE_LOG. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" REFERENCE(IV_DSTART) TYPE EDI_UPDDAT *"---------------------------------------…

QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理

目录 1.简介 2.原理概述 3.实现分析 3.1.通过方法名调用方法的实现分析 3.2.通过可调用对象调用方法的实现分析 4.使用场景 5.总结 1.简介 QMetaObject::invokeMethod 是 Qt 框架中的一个静态方法&#xff0c;用于在运行时调用对象的成员函数。这个方法提供了一种动态调…

Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发

Unity3D 交互式AI桌面宠物开发系列【三】ASR 语音识别 该系列主要介绍怎么制作AI桌面宠物的流程&#xff0c;我会从项目开始创建初期到最终可以和AI宠物进行交互为止&#xff0c;项目已经开发完成&#xff0c;我会仔细梳理一下流程&#xff0c;分步讲解。 这篇文章主要讲有关于…

Java 状态模式 详解

状态模式详解 一、状态模式概述 状态模式(State Pattern)是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为&#xff0c;使对象看起来似乎修改了它的类。 核心特点 状态封装&#xff1a;将每个状态的行为封装到独立的类中状态转换&#xff1a…

Nginx 配置 HTTPS 与 WSS 完整指南

Nginx 配置 HTTPS 与 WSS 完整指南 本教程将手把手教你如何为网站配置 HTTPS 加密访问&#xff0c;并通过反向代理实现安全的 WebSocket&#xff08;WSS&#xff09;通信。以 https://www.zhegepai.cn 域名为例&#xff0c;完整流程约需 30 分钟完成。 一、前置准备 1.1 域名…