PrimeNG Tree组件如何正确删除单个选中TreeNode,避免多选节点误删问题
Tree组件取消选中节点误删关联节点问题修复
问题根因
现有代码的逻辑缺陷位于父节点取消选中分支:当触发unselect事件的节点无父级时,代码会直接遍历删除该节点所有子节点对应的functions记录,未校验子节点是否仍处于选中状态。
主流Tree组件默认自带父子选中联动能力:当父节点下的最后一个选中子节点被取消时,组件会自动触发父节点的unselect事件,此时会误删该父节点下所有子节点的权限记录,导致取消单个节点却丢失多个选中记录的问题。
修复方案
方案一:无需父子选中联动,取消单个节点仅删除对应记录
如果业务不需要勾选父节点自动全选子节点的联动逻辑,直接简化删除逻辑即可:
nodeUnselect(event) { if (this.dialogDate) { this.selectedNode.push(event.node); if (event.node.parent) { this.selectedNode.push(event.node.parent); } } else { // 仅处理当前取消选中的节点,不关联父子节点 if (this.userData.functions && event.node.data && event.node.data.functionFK) { delete this.userData.functions[event.node.data.functionFK]; } } }
方案二:保留父子选中联动逻辑
如果需要保留「取消父节点则同步删除所有子节点权限」的逻辑,只需在父节点分支增加子节点选中状态校验,仅当无剩余选中子节点时再执行批量删除:
nodeUnselect(event) { if (this.dialogDate) { this.selectedNode.push(event.node); if (event.node.parent) { this.selectedNode.push(event.node.parent); } } else { if (event.node.parent) { // 子节点取消选中,仅删除当前子节点记录 if (this.userData.functions && event.node.data && event.node.data.functionFK) { delete this.userData.functions[event.node.data.functionFK]; } } else { // 校验父节点下是否还有处于选中状态的子节点,checked为组件选中状态字段,可根据实际使用的组件库替换为selected等对应字段 const hasCheckedChild = event.node.children?.some(child => child.checked); if (!hasCheckedChild && event.node.children?.length) { for (const childNode of event.node.children) { if (this.userData.functions && childNode.data && childNode.data.functionFK) { delete this.userData.functions[childNode.data.functionFK]; } } } // 如需删除父节点自身对应的权限记录,补充以下逻辑 if (this.userData.functions && event.node.data && event.node.data.functionFK) { delete this.userData.functions[event.node.data.functionFK]; } } } }
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

