[mind-elixir]Mind-Elixir 的交互增強:單擊、雙擊與鼠標 Hover 功能實現

[mind-elixir]Mind-Elixir 的交互增強:單擊、雙擊與鼠標 Hover 功能實現

功能簡述

  1. 通過防抖,實現單擊雙擊區分
  2. 通過mousemove事件,實現hover效果

實現思路

(一)單擊與雙擊事件
  1. 功能描述
    • 單擊節點時,可以觸發單擊事件,用于執行一些簡單操作,如顯示節點詳情、切換樣式等。
    • 雙擊節點時,可以觸發雙擊事件,用于執行更復雜的操作,如編輯節點內容、展開/折疊子節點等。
    • 通過防抖處理,能夠準確區分單擊和雙擊事件,避免誤判。
  2. 實現思路
    • 使用 clickTimerclickCount 來記錄點擊事件的時間和次數。
    • 當節點被選中時,通過 handleNodeSelect 方法判斷是單擊還是雙擊。
    • 如果是同一個節點在短時間內多次點擊,則視為雙擊;否則視為單擊。
  3. 代碼實現
    handleNodeSelect(nodeData) {// 如果是同一個節點if (this.lastClickedNode && this.lastClickedNode.id === nodeData.id) {this.clickCount++} else {// 不同節點,重置計數this.clickCount = 1this.lastClickedNode = nodeData}// 清除之前的定時器if (this.clickTimer) {clearTimeout(this.clickTimer)}// 設置新的定時器this.clickTimer = setTimeout(() => {if (this.clickCount === 1) {// 單擊console.log('觸發點擊', nodeData)} else if (this.clickCount >= 2) {// 雙擊(或多擊,都當作雙擊處理)console.log('觸發雙擊', nodeData)}// 重置計數this.clickCount = 0this.lastClickedNode = null}, 200) // 200ms內的多次點擊判斷為雙擊
    }
    
(二)鼠標 Hover 事件
  1. 功能描述
    • 當鼠標懸停在某個節點上時,可以獲取該節點的 ID,用于高亮顯示、提示信息等操作。
    • 通過監聽 mousemove 事件,實時獲取鼠標位置和對應的節點信息。
  2. 實現思路
    • handleMouseMove 方法中,通過事件目標(e.target)獲取節點的 ID。
    • 判斷當前鼠標所在位置是否包含特定的節點元素(如 me-tpc),從而確定是否觸發 Hover 事件。
  3. 代碼實現
    // 鼠標移動事件handleMouseMove(e) {if (e?.target?.tagName === 'ME-TPC') {const nodeId = e.target.getAttribute('data-nodeid')if (nodeId !== this.hoverId) {console.log('鼠標移入', nodeId)this.hoverId = nodeId}} else {if (this.hoverId) {console.log('鼠標移出', this.hoverId)this.hoverId = ''}}}

具體代碼實現

<template><div class="box"><div id="map" @mousemove="handleMouseMove"></div><div style="margin-top: 20px"><button @click="test1">測試1</button></div></div>
</template><script>
import MindElixir from 'mind-elixir'
import example from 'mind-elixir/example'const mock = {id: 'root',topic: '中心主題',children: [{id: 'child1',topic: '子主題1',children: []},{id: 'child2',topic: '子主題2',children: []}]
}export default {name: 'MindElixir',data() {return {ME: null,// 單擊雙擊防抖處理clickTimer: null,clickCount: 0,lastClickedNode: null,// 鼠標移入idhoverId: ''}},mounted() {const generateMainBranch = ({ pT, pL, pW, pH, cT, cL, cW, cH, direction }) => {console.log('111', pT, pL, pW, pH)console.log('222', cT, cL, cW, cH)console.log('direction', direction)const x1 = pWconst y1 = pT + pH / 2const c1 = pW + (cL - pW) / 2const c2 = cT + cH / 2return `M ${x1} ${y1} H ${c1} V ${c2} H ${cL}`}console.log('example', example)const theme = MindElixir.THEMEtheme.cssVar['--root-bgcolor'] = '#2499f2'theme.cssVar['--root-radius'] = '5px'theme.cssVar['--main-radius'] = '5px'theme.palette = ['#27f25a']this.ME = new MindElixir({el: '#map',locale: 'zh_CN',draggable: true, // 啟用節點拖拽editable: true, // 啟用編輯功能contextMenu: true, // 啟用右鍵菜單toolBar: true, // 啟用工具欄nodeMenu: true, // 啟用節點菜單keypress: true, // 啟用快捷鍵// before: {},generateMainBranch})this.ME.bus.addListener('operation', operation => {console.log('operation', operation)})this.ME.init({nodeData: mock,theme})// 監聽節點選擇事件(需要防抖處理單擊/雙擊)this.ME.bus.addListener('selectNode', this.handleNodeSelect)},methods: {test1() {const mock2 = {id: 'root',topic: '中心主題222',style: {color: 'yellow'},children: [{id: 'child3',topic: '子主題3',children: []},{id: 'child4',topic: '子主題4',children: []}]}this.ME.refresh({nodeData: mock2})},// 單擊雙擊事件handleNodeSelect(nodeData) {// 如果是同一個節點if (this.lastClickedNode && this.lastClickedNode.id === nodeData.id) {this.clickCount++} else {// 不同節點,重置計數this.clickCount = 1this.lastClickedNode = nodeData}// 清除之前的定時器if (this.clickTimer) {clearTimeout(this.clickTimer)}// 設置新的定時器this.clickTimer = setTimeout(() => {if (this.clickCount === 1) {// 單擊console.log('觸發點擊', nodeData)} else if (this.clickCount >= 2) {// 雙擊(或多擊,都當作雙擊處理)console.log('觸發雙擊', nodeData)}// 重置計數this.clickCount = 0this.lastClickedNode = null}, 200) // 200ms內的多次點擊判斷為雙擊},// 鼠標移動事件handleMouseMove(e) {if (e?.target?.tagName === 'ME-TPC') {const nodeId = e.target.getAttribute('data-nodeid')if (nodeId !== this.hoverId) {console.log('鼠標移入', nodeId)this.hoverId = nodeId}} else {if (this.hoverId) {console.log('鼠標移出', this.hoverId)this.hoverId = ''}}}}
}
</script><style lang="less" scoped>
.box {text-align: center;
}
#map {width: 100%;height: 800px;overflow: auto;
}
</style>

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

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

相關文章

c++-迭代器類別仿函數常用算法函數

C常用算法函數 1. 前置知識 1.1 迭代器的類別 C中&#xff0c;迭代器是 STL 容器庫的核心組件之一&#xff0c;具有舉足輕重的作用&#xff0c;它提供了一種 統一的方式來訪問和遍歷容器&#xff0c;而無需關心底層數據結構的具體實現。迭代器類似指針&#xff0c;但比指針更通…

Python深度學習框架TensorFlow與Keras的實踐探索

基礎概念與安裝配置 TensorFlow核心架構解析 TensorFlow是由Google Brain團隊開發的開源深度學習框架&#xff0c;其核心架構包含數據流圖&#xff08;Data Flow Graph&#xff09;和張量計算系統。數據流圖通過節點表示運算操作&#xff08;如卷積、激活函數&#xff09;&…

c# net6.0+ 安裝中文智能提示

https://github.com/stratosblue/IntelliSenseLocalizer 1、安裝tool dotnet tool install -g islocalizer 2、 安裝IntelliSense 文件&#xff0c;安裝其他net版本修改下版本號 安裝中文net6.0采集包 islocalizer install auto -m net6.0 -l zh-cn 安裝中英文雙語net6.0采集包…

【建模與仿真】二階鄰居節點信息驅動的節點重要性排序算法

導讀&#xff1a; 在復雜網絡中&#xff0c;挖掘重要節點對精準推薦、交通管控、謠言控制和疾病遏制等應用至關重要。為此&#xff0c;本文提出一種局部信息驅動的節點重要性排序算法Leaky Noisy Integrate-and-Fire (LNIF)。該算法通過獲取節點的二階鄰居信息計算節點重要性&…

指令微調Qwen3實現文本分類任務

參考文檔&#xff1a; SwanLab入門深度學習&#xff1a;Qwen3大模型指令微調 - 肖祥 - 博客園 vLLM&#xff1a;讓大語言模型推理更高效的新一代引擎 —— 原理詳解一_vllm 原理-CSDN博客 概述 為了實現對100個標簽的多標簽文本分類任務&#xff0c;前期調用gpt-4o進行prom…

【機器學習-3】 | 決策樹與鳶尾花分類實踐篇

0 序言 本文將深入探討決策樹算法&#xff0c;先回顧下前邊的知識&#xff0c;從其基本概念、構建過程講起&#xff0c;帶你理解信息熵、信息增益等核心要點。 接著在引入新知識點&#xff0c;介紹Scikit - learn 庫中決策樹的實現與應用&#xff0c;再通過一個具體項目的方式來…

【數字投影】折幕影院都是沉浸式嗎?

折幕影院作為一種現代化的展示形式&#xff0c;其核心特點在于通過多塊屏幕拼接和投影融合技術&#xff0c;打造更具包圍感的視覺體驗。折幕影院設計通常采用多折幕結構&#xff0c;如三折幕、五折幕等&#xff0c;利用多臺投影機的協同工作&#xff0c;呈現無縫銜接的超大畫面…

數據結構——圖(三、圖的 廣度/深度 優先搜索)

一、廣度優先搜索(BFS)①找到與一個頂點相鄰的所有頂點 ②標記哪些頂點被訪問過 ③需要一個輔助隊列#define MaxVertexNum 100 bool visited[MaxVertexNum]; //訪問標記數組 void BFSTraverse(Graph G){ //對圖進行廣度優先遍歷&#xff0c;處理非連通圖的函數 for(int i0;i…

直擊WAIC | 百度袁佛玉:加速具身智能技術及產品研發,助力場景應用多樣化落地

7月26日&#xff0c;2025世界人工智能大會暨人工智能全球治理高級別會議&#xff08;WAIC&#xff09;在上海開幕。同期&#xff0c;由國家地方共建人形機器人創新中心&#xff08;以下簡稱“國地中心”&#xff09;與中國電子學會聯合承辦&#xff0c;百度智能云、中國聯通上海…

2025年人形機器人動捕技術研討會將在本周四召開

2025年7月31日愛迪斯通所主辦的【2025人形機器動作捕捉技術研討會】是攜手北京天樹探界公司線下活動結合線上直播的形式&#xff0c;會議將聚焦在“動作捕捉軟硬件協同&#xff0c;加速人形機器人訓練”&#xff0c;將深度講解多項核心技術&#xff0c;包含全球知名的慣性動捕大…

Apple基礎(Xcode①-項目結構解析)

要運行設備之前先選擇好設備Product---->Destination---->選擇設備首次運行手機提示如出現 “未受信任的企業級開發者” → 手機打開 設置 ? 通用 ? VPN與設備管理 → 信任你的 Apple ID 即可ContentView 是 SwiftUI 項目里 最頂層、最主界面 的那個“頁面”&#xff0…

微服務 02

一、網關路由網關就是網絡的關口。數據在網絡間傳輸&#xff0c;從一個網絡傳輸到另一網絡時就需要經過網關來做數據的路由和轉發以及數據安全的校驗。路由是網關的核心功能之一&#xff0c;決定如何將客戶端請求映射到后端服務。1、快速入門創建新模塊&#xff0c;引入網關依賴…

04動手學深度學習筆記(上)

04數據操作 import torch(1)張量表示一個數據組成的數組&#xff0c;這個數組可能有多個維度。 xtorch.arange(12) xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])(2)通過shape來訪問張量的形狀和張量中元素的總數 x.shapetorch.Size([12])(3)number of elements表…

MCU中的RTC(Real-Time Clock,實時時鐘)是什么?

MCU中的RTC(Real-Time Clock,實時時鐘)是什么? 在MCU(微控制器單元)中,RTC(Real-Time Clock,實時時鐘) 是一個獨立計時模塊,用于在系統斷電或低功耗狀態下持續記錄時間和日期。以下是關于RTC的詳細說明: 1. RTC的核心功能 精準計時:提供年、月、日、時、分、秒、…

Linux 進程調度管理

進程調度器可粗略分為兩類&#xff1a;實時調度器(kernel)&#xff0c;系統中重要的進程由實時調度器調度&#xff0c;獲得CPU能力強。非實時調度器(user)&#xff0c;系統中大部分進程由非實時調度器調度&#xff0c;獲得CPU能力弱。實時調度器實時調度器支持的調度策略&#…

基于 C 語言視角:流程圖中分支與循環結構的深度解析

前言&#xff08;約 1500 字&#xff09;在 C 語言程序設計中&#xff0c;控制結構是構建邏輯的核心骨架&#xff0c;而流程圖作為可視化工具&#xff0c;是將抽象代碼邏輯轉化為直觀圖形的橋梁。對于入門 C 語言的工程師而言&#xff0c;掌握流程圖與分支、循環結構的對應關系…

threejs創建自定義多段柱

最近在研究自定義建模&#xff0c;有一個多斷柱模型比較有意思&#xff0c;分享下&#xff0c;就是利用幾組點串&#xff0c;比如上中下&#xff0c;然后每組點又不一樣多&#xff0c;點續還不一樣&#xff0c;(比如第一個環的第一個點在左邊&#xff0c;第二個環在右邊)&#…

Language Models are Few-Shot Learners: 開箱即用的GPT-3(四)

Result續 Winograd-Style Tasks Winograd-Style Tasks 是自然語言處理中的一類經典任務。它源于 Winograd Schema Challenge(WSC),主要涉及確定代詞指的是哪個單詞,旨在評估模型的常識推理和自然語言理解能力。 這個任務中的具體通常包含高度歧義的代詞,但從語義角度看…

BGP高級特性之認證

一、概述BGP使用TCP作為傳輸協議&#xff0c;只要TCP數據包的源地址、目的地址、源端口、目的端 口和TCP序號是正確的&#xff0c;BGP就會認為這個數據包有效&#xff0c;但數據包的大部分參數對于攻擊 者來說是不難獲得的。為了保證BGP免受攻擊&#xff0c;可以在BGP鄰居之間使…

商旅平臺怎么選?如何規避商旅流程中的違規風險?

在中大型企業的商旅管理中&#xff0c;一個典型的管理“黑洞”——流程漏洞與超標正持續吞噬企業成本與管理效能&#xff1a;差標混亂、審批脫節讓超規訂單頻頻闖關&#xff0c;不僅讓企業商旅成本超支&#xff0c;還可能引發稅務稽查風險。隱性的合規風險&#xff0c;比如虛假…