element-ui自制树形穿梭框

news2025/4/17 13:08:21

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-tree
                ref="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-tree
                ref="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.coloradmin.cn/o/2330746.html

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

相关文章

Linux系统学习Day04 阻塞特性,文件状态及文件夹查询

知识点4【文件的阻塞特性】 文件描述符 默认为 阻塞 的 比如&#xff1a;我们读取文件数据的时候&#xff0c;如果文件缓冲区没有数据&#xff0c;就需要等待数据的到来&#xff0c;这就是阻塞 当然写入的时候&#xff0c;如果发现缓冲区是满的&#xff0c;也需要等待刷新缓…

Python基础——Pandas库

对象的创建 导入 Pandas 时&#xff0c;通常给其一个别名“pd”&#xff0c;即 import pandas as pd。作为标签库&#xff0c;Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说&#xff0c;列表之于字典&#xff0c;就如 NumPy 之于 Pandas。Pandas 中&#xff0c;所有数…

C++: 类型转换

C: 类型转换 &#xff08;一&#xff09;C语言中的类型转换volatile关键字 修饰const变量 &#xff08;二&#xff09;C四种强制类型转换1. static_cast2. reinterpret_cast3. const_cast4. dynamic_cast总结 (三)RTTI &#xff08;一&#xff09;C语言中的类型转换 在C语言中…

STM32——DAC转换

DAC简介 DAC&#xff0c;全称&#xff1a;Digital-to-Analog Converter&#xff0c;扑指数字/模拟转换器 ADC和DAC是模拟电路与数字电路之间的桥梁 DAC的特性参数 1.分辨率&#xff1a; 表示模拟电压的最小增量&#xff0c;常用二进制位数表示&#xff0c;比如&#xff1a…

Kafka的索引设计有什么亮点

想获取更多高质量的Java技术文章&#xff1f;欢迎访问Java技术小馆官网&#xff0c;持续更新优质内容&#xff0c;助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Kafka的索引设计有什么亮点&#xff1f; Kafka 之所以能在海量数据的传输和处理过程中保持高…

在深度学习中,如何统计模型的 ​​FLOPs(浮点运算次数)​​ 和 ​​参数量(Params)

在深度学习中&#xff0c;统计模型的FLOPs&#xff08;浮点运算次数&#xff09;和参数量&#xff08;Params&#xff09;是评估模型复杂度和计算资源需求的重要步骤。 一、参数量&#xff08;Params&#xff09;计算 参数量指模型中所有可训练参数的总和&#xff0c;其计算与…

Linux之Shell脚本--命令提示的写法

原文网址&#xff1a;Linux之Shell脚本--命令提示的写法-CSDN博客 简介 本文介绍Linux的Shell脚本命令提示的写法。 场景描述 在写脚本时经常会忘记怎么使用&#xff0c;需要进行命令提示。比如&#xff1a;输入-h参数&#xff0c;能打印用法。 实例 新建文件&#xff1a…

Day19 -实例:xcx逆向提取+微信开发者工具动态调试+bp动态抓包对小程序进行资产收集

思路&#xff1a; 拿到源码后的测试方向&#xff1a; Step1、xcx逆向提取源码 00x1 先将曾经使用小程序记录删除 00x2 访问小程序 例&#xff1a;汉川袁老四小程序 00x3 将文件给xcx进行逆向解包 xcx工具的目录下&#xff0c;wxpack文件夹内 Step2、微信开发者工具进行动态…

鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续

飞机大战可以把飞机改成图片&#xff0c;目前包含无敌模式&#xff0c;自动射弹&#xff0c;暂停和继续的功能 代码如下&#xff1a; // 定义位置类 class GamePosition {x: numbery: numberconstructor(x: number, y: number) {this.x xthis.y y} }Entry Component struct…

从基础算力协作到超智融合,超算互联网助力大语言模型研习

一、背景 大语言模型&#xff08;LLMs&#xff09;的快速发展释放出了AI应用领域的巨大潜力。同时&#xff0c;大语言模型作为 AI领域的新兴且关键的技术进展&#xff0c;为 AI 带来了全新的发展方向和应用场景&#xff0c;给 AI 注入了新潜力&#xff0c;这体现在大语言模型独…

M1使用docker制作镜像xxl-job,供自己使用

很苦逼一个情况,m1的docker假如不翻墙&#xff0c;我们找不到xxl-job,所以我们要自己制作 首先先去下载xxl-job源码https://gitee.com/xuxueli0323/xxl-job 你把它拉去到idea中 拉去成功后&#xff0c;进入这个xxl-job目录 执行 mvn clean package -Dmaven.test.skiptrue(这一步…

第一个简易SSM框架项目

引言 这是一个简易SSM整合项目&#xff0c;适合后端入门的练习项目&#xff0c;其中没有太多的业务操作&#xff0c;主要是这个框架&#xff0c;以及编码的顺序&#xff0c;希望大家有所收获 首先需要先配置环境 数据库环境 创建一个存放书籍的数据库表 create database s…

golang 计时器内存泄露问题 与 pprof 性能分析工具

&#xff08;上图用 go tool pprof 工具分析生成&#xff09; 这种会造成内存泄露 因为每次for都会新建一个time对象&#xff0c;只有到期后会被回收。 解决方法&#xff1a;用time.NewTimer与time.Reset每次重新激活定时器 背景 我先贴一下会发生内存泄漏的代码段&#xff0c…

深度学习的下一个突破:从图像识别到情境理解

引言 过去十年&#xff0c;深度学习在图像识别领域取得了惊人的突破。从2012年ImageNet大赛上的AlexNet&#xff0c;到后来的ResNet、EfficientNet&#xff0c;再到近年来Transformer架构的崛起&#xff0c;AI已经能在许多任务上超越人类&#xff0c;比如人脸识别、目标检测、医…

深入解析Spring Boot自动装配:原理、设计与最佳实践

引言 Spring Boot作为现代Java开发中的一股清流&#xff0c;凭借其简洁、快速和高效的特性&#xff0c;迅速赢得了广大开发者的青睐。而在Spring Boot的众多特性中&#xff0c;自动装载&#xff08;Auto-configuration&#xff09;无疑是最为耀眼的明珠之一。本文将深入剖析Sp…

【USRP】srsRAN 开源 4G 软件无线电套件

srsRAN 是SRS开发的开源 4G 软件无线电套件。 srsRAN套件包括&#xff1a; srsUE - 具有原型 5G 功能的全栈 SDR 4G UE 应用程序srsENB - 全栈 SDR 4G eNodeB 应用程序srsEPC——具有 MME、HSS 和 S/P-GW 的轻量级 4G 核心网络实现 安装系统 Ubuntu 20.04 USRP B210 sudo …

《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第二篇:项目创建和初始化

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 《从零搭建Vue3项目实战》&#xff08;AI辅助…

简单线程池实现

线程池的概念 线程池内部可以预先去进行创建出一批线程&#xff0c;对于每一个线程&#xff0c;它都会周期性的进行我们的任务处理。 线程内部在维护一个任务队列&#xff0c;其中我们外部可以向任务队列里放任务&#xff0c;然后内部的线程从任务队列里取任务&#xff0c;如…

CentOS7 安装 LLaMA-Factory

虚拟机尽量搞大 硬盘我配置了80G&#xff0c;内存20G 下载源码 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git 如果下载不了&#xff0c;可以进入github手动下载&#xff0c;然后在传入服务器。 也可以去码云搜索后下载 安装conda CentOS7安装conda…

最新扣子(Coze)案例教程:最新抖音视频文案提取方法替代方案,音频视频提取文案插件制作,手把手教学,完全免费教程

&#x1f468;‍&#x1f4bb; 星球群同学反馈&#xff0c;扣子平台的视频提取插件已下架&#xff0c;很多智能体及工作流不能使用&#xff0c;斜杠君这里研究了一个替代方案分享给大家。 方案原理&#xff1a;无论是任何视频或音频转文案&#xff0c;我们提取的方式首先都是要…