From 1f6665bee435a627ec760f0d25152230545d177a Mon Sep 17 00:00:00 2001 From: qsh <> Date: Thu, 26 Feb 2026 11:54:34 +0800 Subject: [PATCH] sc --- src/components/tree-select.vue | 70 ++++++++++++++++++++++--------- src/pages/account/accountForm.vue | 7 +++- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/components/tree-select.vue b/src/components/tree-select.vue index dd6a09a..867506e 100644 --- a/src/components/tree-select.vue +++ b/src/components/tree-select.vue @@ -110,14 +110,9 @@ // 找到当前菜单 const menu = findMenuById(menuId, props.treeData) - // 如果是上级菜单,选中所有子菜单 + // 如果是上级菜单,选中所有子菜单(递归) if (menu && hasChildren(menu)) { - menu.children.forEach(child => { - const childId = getMenuId(child) - if (!newSelected.includes(childId)) { - newSelected.push(childId) - } - }) + selectAllChildren(menu, newSelected) } // 检查并选中上级菜单 @@ -132,15 +127,9 @@ // 找到当前菜单 const menu = findMenuById(menuId, props.treeData) - // 如果是上级菜单,取消选中所有子菜单 + // 如果是上级菜单,取消选中所有子菜单(递归) if (menu && hasChildren(menu)) { - menu.children.forEach(child => { - const childId = getMenuId(child) - const childIndex = newSelected.indexOf(childId) - if (childIndex > -1) { - newSelected.splice(childIndex, 1) - } - }) + unselectAllChildren(menu, newSelected) } // 检查并取消选中上级菜单 @@ -151,6 +140,35 @@ emit('update:modelValue', newSelected) } + // 递归选中所有子菜单 + function selectAllChildren(menu, selected) { + if (menu.children && menu.children.length > 0) { + menu.children.forEach(child => { + const childId = getMenuId(child) + if (!selected.includes(childId)) { + selected.push(childId) + } + // 递归处理更深层级的子菜单 + selectAllChildren(child, selected) + }) + } + } + + // 递归取消选中所有子菜单 + function unselectAllChildren(menu, selected) { + if (menu.children && menu.children.length > 0) { + menu.children.forEach(child => { + const childId = getMenuId(child) + const childIndex = selected.indexOf(childId) + if (childIndex > -1) { + selected.splice(childIndex, 1) + } + // 递归处理更深层级的子菜单 + unselectAllChildren(child, selected) + }) + } + } + // 根据ID查找菜单 function findMenuById(menuId, menus) { for (const menu of menus) { @@ -187,10 +205,8 @@ const parentMenu = findParentMenu(menuId, props.treeData) if (parentMenu) { const parentId = getMenuId(parentMenu) - // 检查父菜单的所有子菜单是否都未选中 - const allChildrenUnchecked = parentMenu.children.every(child => { - return !selected.includes(getMenuId(child)) - }) + // 检查父菜单的所有子菜单(包括深层级)是否都未选中 + const allChildrenUnchecked = checkAllChildrenUnchecked(parentMenu, selected) if (allChildrenUnchecked) { const parentIndex = selected.indexOf(parentId) @@ -203,6 +219,22 @@ } } + // 检查所有子菜单(包括深层级)是否都未选中 + function checkAllChildrenUnchecked(menu, selected) { + if (menu.children && menu.children.length > 0) { + return menu.children.every(child => { + // 检查当前子菜单是否未选中 + const childId = getMenuId(child) + if (selected.includes(childId)) { + return false + } + // 递归检查子菜单的子菜单 + return checkAllChildrenUnchecked(child, selected) + }) + } + return true + } + // 查找父菜单 function findParentMenu(menuId, menus) { for (const menu of menus) { diff --git a/src/pages/account/accountForm.vue b/src/pages/account/accountForm.vue index 9211b71..16b5d5f 100644 --- a/src/pages/account/accountForm.vue +++ b/src/pages/account/accountForm.vue @@ -73,7 +73,7 @@ 数据权限 - +