拖拽树形节点到子节点时层级结构变乱怎么办?
在做部门管理树形结构拖拽时,遇到拖拽父节点到子节点位置,保存后的数据层级完全错乱。我用Vue3+Sortable.js实现,设置了group和animation,拖拽时视觉显示没问题,但更新数据时发现目标节点的children数组被错误挂载到顶层。尝试过用onAdd监听事件手动处理,但遇到TypeError: Cannot read properties of undefined (reading 'children')。
代码大概是这样写的:
onAdd(rootEvent) {
const { item, target } = rootEvent;
const parent = target.parentNode; // 这里可能拿错了父节点
this.updateTree(parent.id, item.id); // 更新父子关系时出错
}
调试发现当拖到叶子节点时,target.parentNode会变成同级元素,该怎么准确获取目标节点的父级?
target.parentNode确实可能拿不到预期的父节点,特别是在拖拽到叶子节点的情况。首先,确保你理解了Sortable.js的事件参数。
onAdd事件中,rootEvent包含了item和target,但target并不一定就是你想要的父节点。你需要通过Sortable.js提供的其他信息来确定实际的目标父节点。可以考虑使用
to属性来获取目标容器(也就是真正的父节点),而不是target.parentNode。通常,to就是你想放的父节点对应的DOM元素。然后,你可以通过这个DOM元素找到它对应的ID,再进行后续的更新操作。这里有一个修改后的代码示例:
确保每个树节点都有一个唯一的ID,并且在DOM上可以通过类似
data-id的属性来访问。这样,当你拖拽一个节点到另一个节点下时,可以通过to.getAttribute('data-id')来获取目标父节点的ID。另外,检查
updateTree方法,确保它能正确处理父子关系的更新。如果updateTree方法中出现了TypeError: Cannot read properties of undefined (reading 'children'),那可能是某个节点的数据结构不完整或者在更新时没有正确初始化children数组。希望这些调整能帮到你,解决拖拽时的层级错乱问题。如果还有其他问题,尽管说。
这里的关键是用数据驱动,别直接操作 DOM。先通过唯一标识找到对应的节点,然后在数据结构上重新挂载。记得给每个节点加个唯一的 id,比如
data-id属性。这个方法能保证层级关系不出错,调试也简单。