From ca40204d43cc98dd8c37ec90aee8d0efdcc62e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A1=97=E8=A7=92=E5=B0=8F=E6=9E=97?= <1013335014@qq.com> Date: Thu, 10 Oct 2024 11:16:24 +0800 Subject: [PATCH] =?UTF-8?q?Fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E5=9C=BA=E6=99=AF=EF=BC=88=E6=90=9C=E7=B4=A2=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E6=9B=BF=E6=8D=A2=E7=AD=89=EF=BC=89=E4=B8=8B=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=8A=B6=E6=80=81=E6=9C=AA=E6=9B=B4=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E8=8A=82=E7=82=B9=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E6=95=B0=E6=8D=AE=E5=BF=AB=E7=85=A7?= =?UTF-8?q?=E7=9A=84=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/core/render/node/MindMapNode.js | 11 ++++-- simple-mind-map/src/layouts/Base.js | 34 +++++++++++++++---- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/simple-mind-map/src/core/render/node/MindMapNode.js b/simple-mind-map/src/core/render/node/MindMapNode.js index 69f8f482..2865b8af 100644 --- a/simple-mind-map/src/core/render/node/MindMapNode.js +++ b/simple-mind-map/src/core/render/node/MindMapNode.js @@ -23,6 +23,8 @@ class MindMapNode { this.opt = opt // 节点数据 this.nodeData = this.handleData(opt.data || {}) + // 保存本次更新时的节点数据快照 + this.nodeDataSnapshot = '' // uid this.uid = opt.uid // 控制实例 @@ -789,9 +791,12 @@ class MindMapNode { if (this.updateUserListNode) this.updateUserListNode() // 更新节点位置 let t = this.group.transform() - // 如果节点位置没有变化,则返回 - if (this.left === t.translateX && this.top === t.translateY) return - this.group.translate(this.left - t.translateX, this.top - t.translateY) + // 保存一份当前节点数据快照 + this.nodeDataSnapshot = JSON.stringify(this.getData()) + // 节点位置变化才更新,因为即使值没有变化属性设置操作也是耗时的 + if (this.left !== t.translateX || this.top !== t.translateY) { + this.group.translate(this.left - t.translateX, this.top - t.translateY) + } } // 获取节点相当于画布的位置 diff --git a/simple-mind-map/src/layouts/Base.js b/simple-mind-map/src/layouts/Base.js index c5460bfc..b84f12ae 100644 --- a/simple-mind-map/src/layouts/Base.js +++ b/simple-mind-map/src/layouts/Base.js @@ -91,6 +91,18 @@ class Base { } } + // 节点节点数据是否发生了改变 + checkIsNodeDataChange(lastData, curData) { + if (lastData) { + // 对比忽略激活状态和展开收起状态 + lastData = typeof lastData === 'string' ? JSON.parse(lastData) : lastData + lastData.isActive = curData.isActive + lastData.expand = curData.expand + lastData = JSON.stringify(lastData) + } + return lastData !== JSON.stringify(curData) + } + // 创建节点实例 createNode(data, parent, isRoot, layerIndex, index, ancestors) { // 编号 @@ -106,6 +118,7 @@ class Base { // 数据上保存了节点引用,那么直接复用节点 if (data && data._node && !this.renderer.reRender) { newNode = data._node + // 节点层级改变了 const isLayerTypeChange = this.checkIsLayerTypeChange( newNode.layerIndex, layerIndex @@ -127,10 +140,17 @@ class Base { newNumberStr ) } - // 主题或主题配置改变了、节点层级改变了,需要重新渲染节点文本等情况需要重新计算节点大小和布局 - const isNeedResizeSources = this.checkIsNeedResizeSources() + // 主题或主题配置改变了 + const isResizeSource = this.checkIsNeedResizeSources() + // 节点数据改变了 + const isNodeDataChange = this.checkIsNodeDataChange( + data._node.nodeDataSnapshot, + data.data + ) + // 重新计算节点大小和布局 if ( - isNeedResizeSources || + isResizeSource || + isNodeDataChange || isLayerTypeChange || newNode.getData('resetRichText') || isNumberChange @@ -138,7 +158,7 @@ class Base { newNode.getSize() newNode.needLayout = true } - this.checkGetGeneralizationChange(newNode, isNeedResizeSources) + this.checkGetGeneralizationChange(newNode, isResizeSource) } else if ( (this.lru.has(uid) || this.renderer.lastNodeCache[uid]) && !this.renderer.reRender @@ -150,6 +170,7 @@ class Base { newNode = this.lru.get(uid) || this.renderer.lastNodeCache[uid] // 保存该节点上一次的数据 const lastData = JSON.stringify(newNode.getData()) + // 节点层级改变了 const isLayerTypeChange = this.checkIsLayerTypeChange( newNode.layerIndex, layerIndex @@ -167,8 +188,8 @@ class Base { data._node = newNode // 主题或主题配置改变了需要重新计算节点大小和布局 const isResizeSource = this.checkIsNeedResizeSources() - // 主题或主题配置改变了、节点层级改变了,需要重新渲染节点文本,节点数据改变了等情况需要重新计算节点大小和布局 - const isNodeDataChange = lastData !== JSON.stringify(data.data) + // 点数据改变了 + const isNodeDataChange = this.checkIsNodeDataChange(lastData, data.data) // 判断编号是否改变 let isNumberChange = false if (hasNumberPlugin) { @@ -177,6 +198,7 @@ class Base { newNumberStr ) } + // 重新计算节点大小和布局 if ( isResizeSource || isNodeDataChange ||