Fix:修复多次粘贴节点时由于节点uid重复造成的渲染异常问题

This commit is contained in:
wanglin2
2023-10-08 09:10:14 +08:00
parent 83a5ef8e2e
commit 2c6b8294f4
3 changed files with 19 additions and 14 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "simple-mind-map",
"version": "0.7.3",
"version": "0.7.3-fix.1",
"description": "一个简单的web在线思维导图",
"authors": [
{

View File

@@ -512,7 +512,7 @@ class Render {
uid: createUid(),
...(appointData || {})
},
children: [...createUidForAppointNodes(appointChildren)]
children: [...createUidForAppointNodes(appointChildren, true)]
}
parent.nodeData.children.splice(index + 1, 0, newNodeData)
})
@@ -558,7 +558,7 @@ class Render {
const index = parent.nodeData.children.findIndex(item => {
return item.data.uid === node.uid
})
const newNodeList = createUidForAppointNodes(simpleDeepClone(nodeList))
const newNodeList = createUidForAppointNodes(simpleDeepClone(nodeList), true)
parent.nodeData.children.splice(
index + 1,
0,
@@ -619,7 +619,7 @@ class Render {
...params,
...(appointData || {})
},
children: [...createUidForAppointNodes(appointChildren)]
children: [...createUidForAppointNodes(appointChildren, true)]
}
node.nodeData.children.push(newNode)
// 插入子节点时自动展开子节点
@@ -659,7 +659,7 @@ class Render {
if (!node.nodeData.children) {
node.nodeData.children = []
}
childList = createUidForAppointNodes(childList)
childList = createUidForAppointNodes(childList, true)
node.nodeData.children.push(...childList)
// 插入子节点时自动展开子节点
node.nodeData.data.expand = true
@@ -1071,7 +1071,9 @@ class Render {
this.activeNodeList.forEach(node => {
node.nodeData.children.push(
...data.map(item => {
return simpleDeepClone(item)
const newData = simpleDeepClone(item)
createUidForAppointNodes([newData], true)
return newData
})
)
})

View File

@@ -167,11 +167,13 @@ export const copyNodeTree = (
tree,
root,
removeActiveState = false,
keepId = false
removeId = true
) => {
tree.data = simpleDeepClone(root.nodeData ? root.nodeData.data : root.data)
// 重新创建节点uid因为节点uid不能重复
if (!keepId) {
// 移除节点uid
if (removeId) {
delete tree.data.uid
} else if (!tree.data.uid) {// 否则保留或生成
tree.data.uid = createUid()
}
if (removeActiveState) {
@@ -180,7 +182,7 @@ export const copyNodeTree = (
tree.children = []
if (root.children && root.children.length > 0) {
root.children.forEach((item, index) => {
tree.children[index] = copyNodeTree({}, item, removeActiveState, keepId)
tree.children[index] = copyNodeTree({}, item, removeActiveState, removeId)
})
} else if (
root.nodeData &&
@@ -188,7 +190,7 @@ export const copyNodeTree = (
root.nodeData.children.length > 0
) {
root.nodeData.children.forEach((item, index) => {
tree.children[index] = copyNodeTree({}, item, removeActiveState, keepId)
tree.children[index] = copyNodeTree({}, item, removeActiveState, removeId)
})
}
return tree
@@ -766,14 +768,15 @@ export const addDataToAppointNodes = (appointNodes, data = {}) => {
return appointNodes
}
// 给指定的节点列表树数据添加uid如果不存在的话,会修改原数据
export const createUidForAppointNodes = appointNodes => {
// 给指定的节点列表树数据添加uid会修改原数据
// createNewId默认为false即如果节点不存在uid的话会创建新的uid。如果传true那么无论节点数据原来是否存在uid都会创建新的uid
export const createUidForAppointNodes = (appointNodes, createNewId = false) => {
const walk = list => {
list.forEach(node => {
if (!node.data) {
node.data = {}
}
if (isUndef(node.data.uid)) {
if (createNewId || isUndef(node.data.uid)) {
node.data.uid = createUid()
}
if (node.children && node.children.length > 0) {