当前位置: 首页 > news >正文

[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) {const hasMeTpc = e?.target?.querySelector('me-tpc') !== nullif (!hasMeTpc) {if (e.target) {const nodeId = e.target.getAttribute('data-nodeid')console.log('鼠标所在节点的id:', nodeId)}}
    }
    

代码

<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}},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) {const hasMeTpc = e?.target?.querySelector('me-tpc') !== nullif (!hasMeTpc) {if (e.target) {const nodeId = e.target.getAttribute('data-nodeid')console.log('鼠标所在节点的id:', nodeId)}}}}
}
</script><style lang="less" scoped>
.box {text-align: center;
}
#map {width: 100%;height: 800px;overflow: auto;
}
</style>
http://www.dtcms.com/a/307448.html

相关文章:

  • 解决宇道项目关于接收日期格式yyyy-MM-dd HH:mm:ss后端自动转为1970-01-01 00:00:00的问题
  • 思途JSP学习 0731
  • 红黑树×协程×内存序:2025 C++后端核心三体问题攻防手册
  • LeetCode Hot 100:42. 接雨水
  • MCU中的RTC(Real-Time Clock,实时时钟)是什么?
  • 聊聊接口测试依赖第三方数据测试策略
  • mysql主从搭建(docker)
  • Verilog与SytemVerilog差别
  • 【爬虫实战】使用Python和JS逆向基于webpack的游戏平台
  • vue 中 props 直接解构的话会数据丢失响应式
  • 在 CentOS 7 安装中文字体
  • 法国声学智慧 ,音响品牌SK (SINGKING AUDIO) 重构专业音频边界
  • vue+ts 基础面试题 (二)
  • 正向运动学(Forward Kinematics,简称FK)和逆向运动学(Inverse Kinematics,简称IK)
  • Java项目:基于SSM框架实现的校园活动资讯网管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 分类-鸢尾花分类
  • 佳维视工业显示器在除尘与过滤设备中的应用
  • 7800系列三端固定式线性稳压器的典型应用电路
  • MakeInstaller: 一款麒麟操作系统安装包制作工具
  • 进阶向:YOLOv11模型轻量化
  • TGD第九篇:三维应用——视频边缘检测
  • 爱普生002墨水与004墨水基本参数及支持机型
  • 【10】大恒相机SDK C++开发 ——对相机采集的原图像数据IFrameData裁剪ROI 实时显示在pictureBox中,3种方法实现(效率不同)
  • 零基础构建MCP服务器:TypeScript/Python双语言实战指南
  • 某讯视频风控参数逆向分析
  • 《C#与.NET Core跨平台开发的融合架构与实践逻辑》
  • 基于STM32的智能温控通风系统设计
  • Web 开发 08
  • 前端核心技术Node.js(四)——express框架
  • 【JavaEE】(7) 网络原理 TCP/IP 协议