前端笔记之el-tree结合el-tree-transfer实现穿梭框里展示树形数据
参考文章我把他的弹框单拉出来一个独立文件作为组件方便使用遇到一些问题记录一下。testComponet.vuetemplatedivclassper_containerdivclassper_con_leftdivclassper_con_title未选/divdivclasscheck_allel-checkbox:indeterminateconfig.left.isIndeterminatev-modelconfig.left.checkAllchangehandleCheckAll($event, left)全选/全不选/el-checkbox/divdivclasstreeel-treereftreeLeft:datatreeDataArr:propspropsDefaultnode-keyidshow-checkbox:filter-node-methodfilterNodeLeftcheck-changehandleCheckChange(left)//div/divdivclassoperationel-buttontypeprimaryclicktoRight()移入iclassel-icon-d-arrow-right/i/el-buttonel-buttontypeprimaryiconel-icon-d-arrow-leftclicktoLeft()移除/el-button/divdivclassper_con_rightdivclassper_con_title已选/divdivclasscheck_allel-checkbox:indeterminateconfig.right.isIndeterminatev-modelconfig.right.checkAllchangehandleCheckAll($event, right)全选/全不选/el-checkbox/divdivclasstreeel-treereftreeRight:datatreeDataArr:propspropsDefaultnode-keyidshow-checkbox:filter-node-methodfilterNodeRightcheck-changehandleCheckChange(right)//div/div/div/templatescriptexportdefault{props:[treeData],mounted(){this.treeDataArrthis.treeData;this.allParentKeysthis.treeDataArr.map((item){returnitem.id;});if(this.$refs.treeLeftthis.$refs.treeRight){this.$nextTick((){this.setTreeFilter();});}},created(){// this.treeDataArr this.treeData;// this.allParentKeys this.treeDataArr.map((item) {// return item.id;// });// if (this.$refs.treeLeft this.$refs.treeRight) {// this.$nextTick(() {// this.setTreeFilter();// });// }},data(){return{propsDefault:{label:name},isIndeterminateL:false,isIndeterminateR:false,checkAllLeft:false,checkAllRight:false,treeDataArr:[],checkedKeys:[],halfCheckedKeys:[],checkedNodes:[],config:{left:{isIndeterminate:false,checkAll:false,ref:treeLeft},right:{isIndeterminate:false,checkAll:false,ref:treeRight}}};},methods:{setTreeFilter(){this.$refs.treeLeft.filter();this.$refs.treeRight.filter();},toLeft(){this.checkedKeysthis.$refs.treeRight.getCheckedKeys();this.halfCheckedKeysthis.$refs.treeRight.getHalfCheckedKeys();this.settreeDataArr(this.treeDataArr,false);this.setTreeFilter();this.$refs.treeLeft.setCheckedKeys(this.checkedKeys);this.$refs.treeRight.setCheckedKeys([]);},toRight(){this.checkedKeysthis.$refs.treeLeft.getCheckedKeys();this.halfCheckedKeysthis.$refs.treeLeft.getHalfCheckedKeys();this.settreeDataArr(this.treeDataArr,true);this.setTreeFilter();this.$refs.treeRight.setCheckedKeys(this.checkedKeys);this.$refs.treeLeft.setCheckedKeys([]);},filterNodeLeft(value,data){console.log(filterNodeLeft,data);return!data.selected;},filterNodeRight(value,data){console.log(filterNodeRight,data);returndata.selected;},// 递归设置数据选中状态settreeDataArr(tree,type){constsetTree(treeDataArr){treeDataArr.forEach((item,index){if(this.checkedKeys.includes(item.id)){treeDataArr[index].selectedtype;}if(item.childrenitem.children.length){setTree(item.children);// 判断半选框是否需要移动if(this.halfCheckedKeys.includes(item.id)){if(type){treeDataArr[index].selectedtype;}else{consttargettreeDataArr[index].children.find((it){returnit.selected;});if(!target){treeDataArr[index].selectedtype;}}}}});};setTree(tree);},submitEdit(){this.$emit(permissionData,this.treeDataArr);},// 勾选树结构时判断是否勾选上面的全选handleCheckChange(type){this.checkedNodesthis.$refs[this.config[type].ref].getCheckedNodes();constpIdsthis.checkedNodes.filter((item){return!item.pId;});if(!pIds.length){this.config[type].checkAllfalse;this.config[type].isIndeterminatefalse;return;}if(pIds.lengththis.allParentKeys.length){this.config[type].checkAlltrue;this.config[type].isIndeterminatefalse;}else{this.config[type].isIndeterminatetrue;this.config[type].checkAllfalse;}},// 全选handleCheckAll(value,type){constkeysvalue?this.treeDataArr.map((item){returnitem.id;}):[];this.$refs[this.config[type].ref].setCheckedKeys(keys,false);}}};/scriptstylelangscssscoped.per_container{display:flex;height:500px;justify-content:space-between;align-items:center;}.per_con_left, .per_con_right{width:45%;height:100%;}.operation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;}.operation .el-button{margin-left:0;margin-bottom:10px;}.per_con_title{height:42px;line-height:26px;border-radius:8px 8px 0 0;padding:8px;align-self:stretch;background:#f2f6f9;font-size:16px;box-sizing:border-box;border:1px solid #d8d8d8;font-weight:700;text-align:left;}.check_all{height:42px;line-height:42px;padding:0 5px;border:1px solid #d8d8d8;border-top:none;text-align:left;}.tree{height:calc(100% - 82px);border:1px solid #d8d8d8;border-top:none;overflow:auto;}/style思路1思路二利用elementUI的filter API对选中节点进行筛选左侧筛选出未选中的右侧筛选出选中的用的还是同一棵树用一个属性来区分是否选择好处是子节点选中父节点会跟随保存不用重新构建树结构。2通过监听treeData值变化调用setTreeFilter也就是this.$refs.treeLeft.filter(); this.$refs.treeRight.filter();里的filter 方法filter 是 el-tree 组件用于动态过滤树节点配合 filter-node-method 属性可以实现节点过滤自定义左右侧树过滤的规则分别是是filterNodeLeft(value, data) { return !data.selected;},和filterNodeRight(value, data) {return data.selected;},是否被选中左移右移来设置selected属性testIndex.vuetemplatediv!--其他页面内容--TestComponent:treeDatamyTreeData//div/templatescriptimportTestComponentfrom/views/test/test.vue;exportdefault{components:{TestComponent},data(){return{myTreeData:[// 这里放置你的树形数据{id:1,name:父节点1,children:[{id:2,name:子节点1}]}]};},// ... existing code ...};/script关于监听treeData变化后给树赋数据这里遇到问题我把原文监听treeData对树进行初始化一开始写在created里导致左右都有树然后改为mounted就没有这个问题。原因操作DOM元素用mounted依赖 DOM 元素 setTreeFilter 方法可能依赖于this.$refs.treeLeft和this.$refs.treeRight这两个 DOM 引用。在 created 阶段DOM 元素还未挂载this.$refs无法正确获取到对应的 DOM 元素从而导致过滤逻辑无法正常执行。而在 mounted 阶段DOM 元素已经挂载完成this.$refs可以正常获取到对应的 DOM 元素过滤逻辑就能正常工作了。treeData:{handler(val){this.treeDataArrval;this.allParentKeysthis.treeDataArr.map((item){returnitem.id;});if(this.$refs.treeLeftthis.$refs.treeRight){this.$nextTick((){this.setTreeFilter();});}},deep:true,},———————————————— 版权声明本文为博主原创文章遵循CC4.0BY-SA版权协议转载请附上原文出处链接和本声明。原文链接https://blog.csdn.net/Error_ABC/article/details/136877442created(){// this.treeDataArr this.treeData;// this.allParentKeys this.treeDataArr.map((item) {// return item.id;// });// if (this.$refs.treeLeft this.$refs.treeRight) {// this.$nextTick(() {// this.setTreeFilter();// });// }},

相关新闻

项目管理进阶:详解华为研发项目管理(IPD流程管理)【附全文阅读】

项目管理进阶:详解华为研发项目管理(IPD流程管理)【附全文阅读】

本文围绕华为 IPD 流程管理展开,IPD 源于 PACE 理论,经 IBM 实践成为系统工程,其核心目标是实现产品开发的准、快、低。它涵盖结构化端到端流程,设有决策评审点和技术评审点把控质量与投资。通过跨部门团队协同,管理新产品开发和老产品优化变更。产品开发流程包括概念、计…

2026/8/17 16:47:27 阅读更多 →
IPD研学:76页页基于IPD思想-华为需求管理培训方案【附全文阅读】

IPD研学:76页页基于IPD思想-华为需求管理培训方案【附全文阅读】

适应人群 本方案适用于企业中参与产品研发、市场、销售、项目管理等部门的人员,尤其是负责需求管理工作的相关从业者;致力于提升产品竞争力,对优化需求管理流程、提高产品开发质量感兴趣的企业管理者;以及希望了解行业前沿需求管理方法,寻求突破和创新的相关人士。…

2026/8/17 16:47:27 阅读更多 →
机带RAM就是内存?详解RAM与硬盘的本质区别及系统协同原理

机带RAM就是内存?详解RAM与硬盘的本质区别及系统协同原理

1. 项目概述:从“机带RAM”的困惑谈起最近在技术社区和日常咨询中,我频繁遇到一个看似基础,却让许多朋友感到困惑的问题:“机带RAM是内存吗?” 尤其是在一些笔记本电脑的系统信息或第三方检测软件里,看到“…

2026/8/17 16:47:27 阅读更多 →

最新新闻

告别多选题分析焦虑:六种方法精准拆解问卷数据

告别多选题分析焦虑:六种方法精准拆解问卷数据

1. 项目概述:从“不会分析”到“精准拆解”的思维跃迁 每次看到问卷数据里那一堆多选题,你是不是就有点头疼?选项之间勾勾连连,数据密密麻麻,Excel的“计数”功能好像不太够用,SPSS里点来点去也不知道选哪个…

2026/8/17 17:24:50 阅读更多 →
【信息科学与工程学】【通信工程】第一百五十九篇 Cloud WAN/Cloud Fabric 的数学建模02

【信息科学与工程学】【通信工程】第一百五十九篇 Cloud WAN/Cloud Fabric 的数学建模02

将 L1 光层+电层 ~ L3 层的理论体系与各家云网络的真实配置对象对齐,深度融合光学(光子集成电路 PIC、调制/探测、光放大)与电学(DSP、DAC/ADC、Driver/TIA、SerDes、FEC)的协同设计数学物理基础。 补充表格(编号 216-223:L1~L3 层 八大云厂商 光电融合设计) 编号 学…

2026/8/17 17:24:50 阅读更多 →
从安装到玩转:Notepad-- 跨平台文本编辑器实战指南

从安装到玩转:Notepad-- 跨平台文本编辑器实战指南

从安装到玩转:Notepad-- 跨平台文本编辑器实战指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 三个真实…

2026/8/17 17:24:50 阅读更多 →
macOS 多窗口总找不到目标?DockDoor 窗口预览神器 3 步让多任务切换一步到位

macOS 多窗口总找不到目标?DockDoor 窗口预览神器 3 步让多任务切换一步到位

macOS 多窗口总找不到目标?DockDoor 窗口预览神器 3 步让多任务切换一步到位 【免费下载链接】DockDoor Window peeking, alt-tab and other enhancements for macOS 项目地址: https://gitcode.com/gh_mirrors/do/DockDoor 你是否也有过这样的瞬间&#xff…

2026/8/17 17:24:50 阅读更多 →
Blender图标系统解析:从SVG架构到插件开发实战

Blender图标系统解析:从SVG架构到插件开发实战

1. 从“图标”到“界面语言”:Blender图标系统的核心价值 如果你刚开始接触Blender,可能会觉得它的界面有点“花里胡哨”——满屏都是各种小图标,而不是像某些软件那样全是文字菜单。但用久了你会发现,这些图标才是让你效率起飞的…

2026/8/17 17:24:50 阅读更多 →
League Akari 完整上手指南:一款基于 LCU API 的英雄联盟本地辅助工具箱

League Akari 完整上手指南:一款基于 LCU API 的英雄联盟本地辅助工具箱

League Akari 完整上手指南:一款基于 LCU API 的英雄联盟本地辅助工具箱 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 排位赛加载…

2026/8/17 17:23:49 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →