From 70c32e3c747fce0ee37232081851c42bbe0e001c Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Tue, 28 Nov 2023 17:37:44 +0800 Subject: [PATCH] =?UTF-8?q?Fix=EF=BC=9A1.=E6=8C=89=E4=BD=8FCtrl=E9=94=AE?= =?UTF-8?q?=E6=97=B6=E7=A6=81=E7=94=A8=E8=8A=82=E7=82=B9=E5=8F=8C=E5=87=BB?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=EF=BC=9B2.=E4=BC=98=E5=8C=96=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=BF=80=E6=B4=BB=E4=BA=8B=E4=BB=B6=E7=9A=84=E6=B4=BE?= =?UTF-8?q?=E5=8F=91=EF=BC=8C=E6=BF=80=E6=B4=BB=E8=8A=82=E7=82=B9=E6=9C=AA?= =?UTF-8?q?=E6=94=B9=E5=8F=98=E6=97=B6=E4=B8=8D=E6=B4=BE=E5=8F=91=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E7=9F=AD=E6=97=B6=E9=97=B4=E6=B4=BE=E5=8F=91?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E4=BA=8B=E4=BB=B6=E6=97=B6=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/src/core/render/Render.js | 31 +++++++++++++++----- simple-mind-map/src/core/render/node/Node.js | 8 ++--- simple-mind-map/src/plugins/Select.js | 4 +-- simple-mind-map/src/utils/index.js | 15 ++++++++++ 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/simple-mind-map/src/core/render/Render.js b/simple-mind-map/src/core/render/Render.js index 31b2761c..ad073d8b 100644 --- a/simple-mind-map/src/core/render/Render.js +++ b/simple-mind-map/src/core/render/Render.js @@ -25,7 +25,8 @@ import { setDataToClipboard, getDataFromClipboard, htmlEscape, - parseAddGeneralizationNodeList + parseAddGeneralizationNodeList, + checkNodeListIsEqual } from '../../utils' import { shapeList } from './node/Shape' import { lineStyleProps } from '../../themes/default' @@ -87,6 +88,9 @@ class Render { this.currentBeingPasteType = '' // 节点高亮框 this.highlightBoxNode = null + // 上一次节点激活数据 + this.lastActiveNode = null + this.lastActiveNodeList = [] // 布局 this.setLayout() // 绑定事件 @@ -335,6 +339,24 @@ class Render { }) } + // 派发节点激活事件 + emitNodeActiveEvent(node = null, activeNodeList = [...this.activeNodeList]) { + let isChange = false + isChange = this.lastActiveNode !== node + if (!isChange) { + isChange = !checkNodeListIsEqual( + this.lastActiveNodeList, + activeNodeList + ) + } + if (!isChange) return + this.lastActiveNode = node + this.lastActiveNodeList = [...activeNodeList] + this.mindMap.batchExecution.push('emitNodeActiveEvent', () => { + this.mindMap.emit('node_active', node, activeNodeList) + }) + } + // 鼠标点击画布时清空当前激活节点列表 clearActiveNodeListOnDrawClick(e, eventType) { if (this.activeNodeList.length <= 0) return @@ -431,7 +453,7 @@ class Render { return } this.clearActiveNodeList() - this.mindMap.emit('node_active', null, []) + this.emitNodeActiveEvent(null, []) } // 清除当前激活的节点列表 @@ -1602,11 +1624,6 @@ class Render { return res } - // 派发节点激活改变事件 - emitNodeActiveEvent() { - this.mindMap.emit('node_active', null, [...this.activeNodeList]) - } - // 高亮节点或子节点 highlightNode(node, range) { const { highlightNodeBoxStyle = {} } = this.mindMap.opt diff --git a/simple-mind-map/src/core/render/node/Node.js b/simple-mind-map/src/core/render/node/Node.js index 9e7b42fb..bbbf2e57 100644 --- a/simple-mind-map/src/core/render/node/Node.js +++ b/simple-mind-map/src/core/render/node/Node.js @@ -442,9 +442,7 @@ class Node { this.mindMap.renderer[ isActive ? 'removeNodeFromActiveList' : 'addNodeToActiveList' ](this) - this.mindMap.emit('node_active', isActive ? null : this, [ - ...this.mindMap.renderer.activeNodeList - ]) + this.renderer.emitNodeActiveEvent(isActive ? null : this) } this.mindMap.emit('node_mousedown', this, e) }) @@ -475,7 +473,7 @@ class Node { }) // 双击事件 this.group.on('dblclick', e => { - if (this.mindMap.opt.readonly) { + if (this.mindMap.opt.readonly || e.ctrlKey) { return } e.stopPropagation() @@ -521,7 +519,7 @@ class Node { this.mindMap.emit('before_node_active', this, this.renderer.activeNodeList) this.renderer.clearActiveNodeList() this.renderer.addNodeToActiveList(this) - this.mindMap.emit('node_active', this, [...this.renderer.activeNodeList]) + this.renderer.emitNodeActiveEvent(this) } // 更新节点 diff --git a/simple-mind-map/src/plugins/Select.js b/simple-mind-map/src/plugins/Select.js index 8ce6d761..f3a93aa3 100644 --- a/simple-mind-map/src/plugins/Select.js +++ b/simple-mind-map/src/plugins/Select.js @@ -133,9 +133,7 @@ class Select { } } if (isNumChange || isNodeChange) { - this.mindMap.emit('node_active', null, [ - ...this.mindMap.renderer.activeNodeList - ]) + this.mindMap.renderer.emitNodeActiveEvent() } } diff --git a/simple-mind-map/src/utils/index.js b/simple-mind-map/src/utils/index.js index e16ce13e..824f4386 100644 --- a/simple-mind-map/src/utils/index.js +++ b/simple-mind-map/src/utils/index.js @@ -1003,3 +1003,18 @@ export const handleSelfCloseTags = str => { }) return str } + +// 检查两个节点列表是否包含的节点是一样的 +export const checkNodeListIsEqual = (list1, list2) => { + if (list1.length !== list2.length) return false + for (let i = 0; i < list1.length; i++) { + if ( + !list2.find(item => { + return item.uid === list1[i].uid + }) + ) { + return false + } + } + return true +}