vue2使用el-tree實現兩棵樹間節點的拖拽復制

原文鏈接:兩棵el-tree的節點跨樹拖拽實現

參照這篇文章,把它做成組件,新增左側樹(可拖出)被拖節點變灰提示;

拖拽中
在這里插入圖片描述
拖拽后
在這里插入圖片描述
TreeDragComponent.vue

<template><!-- 兩棵el-tree的節點跨樹拖拽實現 --><div class="tree-drag"><!-- 左側樹(可拖出) --><el-tree:data="treeData1"ref="tree1"class="tree" node-key="id"draggabledefault-expand-all:allow-drop="returnFalse":props="defaultProps"@node-drag-start="handleDragstart"@node-drag-end="handleDragend"><!-- 使用作用域插槽自定義節點樣式 --><span slot-scope="{ node, data }" :class="{ 'custom-red': data.isHighlighted }">{{ node.label }}</span></el-tree><!-- 右側樹(可拖入) --><el-tree:data="treeData2" ref="tree2"class="tree" node-key="id"draggabledefault-expand-all:props="defaultProps":allow-drop="returnTrue"></el-tree></div>
</template><script>
export default {
name: "TreeDrag",
props:['treeData1','treeData2'],
data() {return {defaultProps: {children: 'children',label: 'name'},};
},
methods: {// (1) 手動觸發:該節點向父組件通知拖拽開始(只不過目標樹是右側樹)// 經過這個移花接木的操作,右側的樹會誤以為是自身的節點觸發了tree-node-drag-start事件,它會將被拖拽節點保存在組件內handleDragstart (node, event) {this.$refs.tree2.$emit('tree-node-drag-start', event, {node: node});},// (2) 鼠標滑過階段// 當鼠標拖拽著左側樹上的節點從右側樹上的節點劃過(也就是觸發dragover事件)時,右側樹會誤以為是在拖拽自己的節點,因此會在tree-node-drag-over事件中自動執行位置計算,所以這一階段無需我們干預。// (3)鼠標釋放階段// 盡管此時右側樹已經誤以為被拖拽的是自身節點,但被拖拽的節點此時仍然是左側樹的子組件,所以當鼠標釋放時,它只能向左側樹(即它的父組件)觸發tree-node-drag-end事件。由于左側樹不允許釋放,所以此時節點并沒有發生移動。// 為了讓右側樹收到鼠標釋放的通知,我們開始進行第二次移花接木,即把左側樹上發生的tree-node-drag-end事件以同樣的方式觸發給右側樹handleDragend (draggingNode, endNode, position, event) {//不只是做節點移動,而是拖拽復制,也就是要保留左側樹上的原節點//真正要保留原節點很難實現,所以選擇在移動后恢復左側樹上的節點// 插入一個空節點用于占位let emptyData = {id: (+new Date), children: []};this.$refs.tree1.insertBefore(emptyData, draggingNode);this.$refs.tree2.$emit('tree-node-drag-end', event);this.$nextTick(() => {// 如果是移動到了當前樹上,需要清掉空節點if (this.$refs.tree1.getNode(draggingNode.data)) {this.$refs.tree1.remove(emptyData);} else {// 如果移動到了別的樹上,需要恢復該節點,并清掉空節點let data = JSON.parse(JSON.stringify(draggingNode.data));this.createHighlightedNode(data); // 添加標記字段this.$refs.tree1.insertAfter(data, this.$refs.tree1.getNode(emptyData));this.$refs.tree1.remove(emptyData);}})},// 遞歸創建帶高亮標記的節點createHighlightedNode(data) {// 給當前節點添加 isHighlighted 屬性data.isHighlighted = true;// 檢查是否有子節點if (data.children && Array.isArray(data.children)) {// 遞歸處理每個子節點data.children.forEach(child => {this.createHighlightedNode(child);});}return data;},// 允許內部拖拽returnTrue () {// 可傳參數:draggingNode, dropNode, type// 校驗所有拖拽節點是否允許放入(如只能放入同級或特定父級)// return this.draggingNodes.every(node => //     node.level <= 2 &&  // 限制最大層級//     node.type !== 'system'  // 限制類型// )return true;},// 禁止內部拖拽returnFalse () {return false;}
}
};
</script><style lang="scss" scoped>
.tree-drag {display: flex;justify-content: space-between;.tree {flex-grow: 1;.custom-red {color: #E4E4E4 !important; /* 紅色背景 */font-size: 14px !important;}}}
</style>

Parent.vue

<TreeDrag :treeData1="treeDataLeft" :treeData2="treeDataRight"></TreeDrag>

element-ui源碼中用于定義樹節點的element-ui\packages\tree\src\tree-node.vue組件
在這里插入圖片描述

下一篇:在此基礎上加功能,el-tree拖拽事件,限制同級拖拽,獲取拖拽后節點的前后節點,同級拖拽合并父節點name且子節點加入目標節點里

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智變與重構:AI 賦能基礎教育教學的范式轉型研究報告

一、研究背景與核心價值 &#xff08;一&#xff09;技術驅動下的教育轉型浪潮 在全球數字化轉型加速的背景下&#xff0c;人工智能作為核心技術力量&#xff0c;正重塑基礎教育生態。據《人工智能賦能未來教育研究報告》指出&#xff0c;我國教育數字化戰略行動已推動超 70…

Go語言中Print、Printf和Println的區別及使用場景詳解

在Go語言的fmt包中&#xff0c;Print、Printf和Println是三個基礎但功能各異的輸出函數。本文將從多個維度進行詳細對比分析&#xff0c;并給出具體的使用建議。 1. 核心區別深度解析 1.1. 函數簽名與基本行為 func Print(a ...interface{}) (n int, err error) func Printf…

高端制造行業 VMware 替代案例合集:10+ 頭部新能源、汽車、半導體制造商以國產虛擬化支持 MES、PLM 等核心應用系統

在“中國制造 2025”政策的推動下&#xff0c;國內的新能源、汽車制造、半導體、高端裝備等高端制造產業迎來了蓬勃發展&#xff0c;成為全球制造業版圖中舉足輕重的力量。訂單數量的激增與國產化轉型的趨勢&#xff0c;也為高端制造企業的 IT 基礎設施帶來了新的挑戰&#xff…

Spring Ai | 從零帶你一起走進AI項目(中英)

目錄 Thinking Study question pox.xml Maven Gradle Configure API Key Use the AI Client Question Thinking 讓數據變得更加貼近用戶的想法 Study question null pox.xml 添加依賴 Maven <dependencies><dependency><groupId>org.springfram…

LiveGBS作為下級平臺GB28181國標級聯2016|2022對接海康大華宇視華為政務公安內網等GB28181國標平臺查看級聯狀態及會話

LiveGBS作為下級平臺GB28181國標級聯2016|2022對接海康大華宇視華為政務公安內網等GB28181國標平臺查看級聯狀態及會話 1、GB/T28181級聯概述2、搭建GB28181國標流媒體平臺3、獲取上級平臺接入信息3.1、向下級提供信息3.2、上級國標平臺添加下級域3.3、接入LiveGBS示例 4、配置…

卸載 Office PLUS

Office PLUS作為微軟官方推出的智能辦公提效工具&#xff0c;自2015年問世以來&#xff0c;憑借其豐富的模板資源和便捷的智能功能&#xff0c;迅速贏得了廣大職場人士和學生的青睞。本文將全面介紹Office PLUS的發展歷程、核心功能、可能帶來的使用問題&#xff0c;以及如何徹…

影響沉金價格的因素如何體現在多層電路板制造上?

隨著科技的不斷發展&#xff0c;電子產品越來越普及&#xff0c;對電路板的需求也越來越大。多層電路板作為電子產品的核心部件&#xff0c;其性能和質量直接影響到整個產品的穩定性和可靠性。在多層電路板的生產過程中&#xff0c;沉金工藝是一種常用的表面處理方法&#xff0…

擴展摩爾投票法:找出出現次數超過 n/3 的元素

文章目錄 問題描述關鍵洞察算法原理Java 實現算法演示投票階段驗證階段 復雜度分析算法關鍵點通用化公式實際應用場景邊界情況處理總結 標簽&#xff1a;LeetCode 169, 摩爾投票法, 多數元素, 算法擴展, 數組處理 在解決多數元素問題時&#xff0c;我們學習了經典的摩爾投票法處…

Git:現代軟件開發的基石——原理、實踐與行業智慧·優雅草卓伊凡

Git&#xff1a;現代軟件開發的基石——原理、實踐與行業智慧優雅草卓伊凡 一、Git的本質與核心原理 1. 技術定義 Git是一個分布式版本控制系統&#xff08;DVCS&#xff09;&#xff0c;由Linus Torvalds在2005年為管理Linux內核開發而創建。其核心是通過快照&#xff08;Sna…

程序人生-hello’s P2P

計算機系統 大作業 題 目 程序人生-hello’s P2P 專 業 計算機與電子通信類 學   號 2023111990 班   級 23L0514 學 生 袁騁 指 導 教 師 史…

Java設計模式之設計原則

Java設計模式 Java設計模式主要原則是開閉原則&#xff0c;即對擴展開放&#xff0c;對修改關閉。由此衍生出5大原則&#xff1a;單一職責原則&#xff0c;里式替換原則&#xff0c;迪米特原則&#xff0c;接口隔離職責&#xff0c;依賴倒置原則。1、開閉原則 開閉原則&#x…

使用 ssld 提取CMS 簽名并重簽名

拿SpringBoard的cms簽名和entitlements.xml&#xff0c;對tihook.dylib進行重簽名 工具來源&#xff1a;https://github.com/eksenior/ssld

WebFuture:測試郵件發送失敗

問題描述&#xff1a;測試郵件發送失敗 問題分析&#xff1a; 查看報錯是模擬發送郵件請將systemsettings.json中的EnabledMail設為false&#xff01; 解決方案&#xff1a; 網站根目錄找到Configuration&#xff0c;如下圖所示&#xff0c;將systemsettings.json中的Enabled…

LiveNVR 直播流拉轉:Onvif/RTSP/RTMP/FLV/HLS 支持海康宇視天地 SDK 接入-視頻廣場頁面集成與視頻播放說明

LiveNVR直播流拉轉&#xff1a;Onvif/RTSP/RTMP/FLV/HLS支持海康宇視天地SDK接入-視頻廣場頁面集成與視頻播放說明 一、視頻頁面集成1.1 關閉接口鑒權1.2 視頻廣場頁面集成1.2.1 隱藏菜單欄1.2.2 隱藏播放頁面分享鏈接 1.3 其它頁面集成 二、播放分享頁面集成2.1 獲取 iframe 代…

12. CSS 布局與樣式技巧

在前端開發中&#xff0c;CSS 是控制頁面樣式和布局的核心技術。本文總結了 CSS 布局中的關鍵概念和實用技巧&#xff0c;包括 overflow 屬性、背景圖片處理、精靈圖技術、display 屬性、浮動布局以及清除浮動的方法。 一、overflow 屬性詳解 overflow 屬性用于控制當元素內容…

OpenCV---Canny邊緣檢測

一、基本概念與核心作用 Canny邊緣檢測是計算機視覺中最經典的邊緣檢測算法之一&#xff0c;由John Canny于1986年提出。其核心目標是在噪聲圖像中提取精確、單像素寬、連續的邊緣&#xff0c;廣泛應用于&#xff1a; 目標檢測預處理&#xff08;如Robomaster中燈條、裝甲板的…

提效-點擊跳轉到源碼

1、localhost項目 例如【鯨島】這個中臺項目啟動地址是localhost。 使用chrome中的【click-to-react-component 】擴展&#xff0c; alt 鼠標左鍵 選擇dom后跳轉到對應文件。 click-to-react-component的原理&#xff08;來自ai&#xff09; click-to-react-component 的工作…

FeignClient發送https請求時的證書驗證原理分析

背景 微服務之間存在調用關系&#xff0c;且部署為 SSL 協議時&#xff0c;Feignt 請求報異常&#xff1a; Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find vali…

性能優化關鍵:link、script和meta的正確打開方式

link 標簽的主要屬性及其作用 屬性是否必填作用描述示例值rel是定義當前文檔與鏈接資源的關系&#xff08;必須屬性&#xff09;。常見值&#xff1a;stylesheet, icon, preload, preconnect 等。rel"stylesheet" rel"icon"href是指定鏈接資源的URL。href…

Linux `less` 命令深度解析與高階應用指南

Linux `less` 命令深度解析與高階應用指南 一、核心功能解析1. 基本作用2. 與類似工具對比二、選項系統詳解1. 常用基礎選項2. 高階選項組合三、高階應用場景1. 日志分析系統2. 代碼審查系統3. 數據管道處理四、特殊文件處理1. 大文件優化查看2. 二進制文件分析五、交互式命令大…