diff --git a/packages/canvas/DesignCanvas/src/api/useCanvas.js b/packages/canvas/DesignCanvas/src/api/useCanvas.js
index 89e30a72c..7c7f71a88 100644
--- a/packages/canvas/DesignCanvas/src/api/useCanvas.js
+++ b/packages/canvas/DesignCanvas/src/api/useCanvas.js
@@ -261,57 +261,62 @@ const operationTypeMap = {
insert: (operation) => {
const { parentId, newNodeData, position, referTargetNodeId } = operation
const parentNode = getNode(parentId) || pageState.pageSchema
-
+ // 1. 确认是否存在 ParentNode
if (!parentNode) {
return {}
}
parentNode.children = parentNode.children || []
+ // 2. 确保 newNodeData 有唯一 ID, 如果没有,则生成新 ID
if (!newNodeData.id) {
newNodeData.id = utils.guid()
}
+ // 3. 查找参考节点
+ let referenceNode = null
if (referTargetNodeId) {
- const referenceNode = getNode(referTargetNodeId)
- let index = parentNode.children.indexOf(referenceNode)
-
- if (index === -1) {
- index = 0
- }
-
- index = position === 'before' ? index : index + 1
-
- parentNode.children.splice(index, 0, newNodeData)
-
- setNode(newNodeData, parentNode)
-
- // 递归构建 nodeMap
- if (Array.isArray(newNodeData?.children) && newNodeData.children.length) {
- const newNode = getNode(newNodeData.id)
- generateNodesMap(newNodeData.children, newNode)
+ referenceNode = getNode(referTargetNodeId)
+ if (!referenceNode) {
+ throw new Error(`Reference node with ID ${referTargetNodeId} not found`)
}
+ }
- return {
- current: newNodeData,
- previous: undefined
- }
+ // 4. 根据position参数选择插入位置
+ let index = parentNode.children.indexOf(referenceNode)
+ if (index === -1 && referTargetNodeId) {
+ index = parentNode.children.length
}
- if (position === 'before') {
- parentNode.children.unshift(newNodeData)
- } else {
- parentNode.children.push(newNodeData)
+ // 5. 插入节点的逻辑
+ const childrenNode = toRaw(referenceNode)
+ switch (position) {
+ case 'before':
+ parentNode.children.unshift(newNodeData)
+ break
+ case 'out':
+ if (childrenNode) {
+ newNodeData.children = Array.isArray(childrenNode) ? [...childrenNode] : [childrenNode]
+ parentNode.children.splice(index, 1, newNodeData)
+ }
+ break
+ case 'bottom':
+ parentNode.children.splice(index + 1, 0, newNodeData)
+ break
+ default:
+ parentNode.children.push(newNodeData)
+ break
}
setNode(newNodeData, parentNode)
- // 递归构建 nodeMap
- if (Array.isArray(newNodeData?.children) && newNodeData.children.length) {
+ // 6. 如果新节点有子节点,递归构建 nodeMap
+ if (Array.isArray(newNodeData?.children) && newNodeData.children.length > 0) {
const newNode = getNode(newNodeData.id)
generateNodesMap(newNodeData.children, newNode)
}
+ // 7. 返回插入结果
return {
current: newNodeData,
previous: undefined
@@ -343,7 +348,7 @@ const operationTypeMap = {
const nodeItem = getNode(item.id)
nodesMap.value.delete(item.id)
- if (Array.isArray(nodeItem.children) && nodeItem.children.length) {
+ if (Array.isArray(nodeItem?.children) && nodeItem?.children.length) {
children.push(...nodeItem.children)
}
})
diff --git a/packages/canvas/container/src/CanvasContainer.vue b/packages/canvas/container/src/CanvasContainer.vue
index 13c6b96c2..1b02a561d 100644
--- a/packages/canvas/container/src/CanvasContainer.vue
+++ b/packages/canvas/container/src/CanvasContainer.vue
@@ -1,14 +1,17 @@
-
+
+
+
@@ -28,6 +31,15 @@
+
+
+
+