From b7da59c0b73b849ac33fe916cb2adadac19d4b10 Mon Sep 17 00:00:00 2001 From: zhangdaiscott Date: Sun, 30 Oct 2022 17:56:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=AD=90=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=85=A8=E9=83=A8=E9=9A=90=E8=97=8F=E8=B7=AF?= =?UTF-8?q?=E7=94=B1,=E5=A6=82=E6=9E=9C=E6=98=AF=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E5=88=99=E9=9A=90=E8=97=8F=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Menu/src/components/BasicSubMenuItem.vue | 3 ++ .../SimpleMenu/src/SimpleSubMenu.vue | 6 ++-- src/utils/common/compUtils.ts | 35 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/components/Menu/src/components/BasicSubMenuItem.vue b/src/components/Menu/src/components/BasicSubMenuItem.vue index 6cd178e..5f92f96 100644 --- a/src/components/Menu/src/components/BasicSubMenuItem.vue +++ b/src/components/Menu/src/components/BasicSubMenuItem.vue @@ -15,6 +15,7 @@ import { defineComponent, computed } from 'vue'; import { Menu } from 'ant-design-vue'; import { useDesign } from '/@/hooks/web/useDesign'; + import { checkChildrenHidden } from '/@/utils/common/compUtils'; import { itemProps } from '../props'; import BasicMenuItem from './BasicMenuItem.vue'; import MenuItemContent from './MenuItemContent.vue'; @@ -38,11 +39,13 @@ Reflect.has(menuTreeItem, 'children') && !!menuTreeItem.children && menuTreeItem.children.length > 0 + &&checkChildrenHidden(menuTreeItem) ); } return { prefixCls, menuHasChildren, + checkChildrenHidden, getShowMenu, }; }, diff --git a/src/components/SimpleMenu/src/SimpleSubMenu.vue b/src/components/SimpleMenu/src/SimpleSubMenu.vue index 9548a49..e713f62 100644 --- a/src/components/SimpleMenu/src/SimpleSubMenu.vue +++ b/src/components/SimpleMenu/src/SimpleSubMenu.vue @@ -36,7 +36,7 @@ import { defineComponent, computed } from 'vue'; import { useDesign } from '/@/hooks/web/useDesign'; import Icon from '/@/components/Icon/index'; - + import { checkChildrenHidden } from '/@/utils/common/compUtils'; import MenuItem from './components/MenuItem.vue'; import SubMenu from './components/SubMenuItem.vue'; import { propTypes } from '/@/utils/propTypes'; @@ -79,18 +79,20 @@ ]; }); - function menuHasChildren(menuTreeItem: Menu): boolean { + function menuHasChildren(menuTreeItem): boolean { return ( !menuTreeItem.meta?.hideChildrenInMenu && Reflect.has(menuTreeItem, 'children') && !!menuTreeItem.children && menuTreeItem.children.length > 0 + &&checkChildrenHidden(menuTreeItem) ); } return { prefixCls, menuHasChildren, + checkChildrenHidden, getShowMenu, getIcon, getI18nName, diff --git a/src/utils/common/compUtils.ts b/src/utils/common/compUtils.ts index d740c73..c1c572f 100644 --- a/src/utils/common/compUtils.ts +++ b/src/utils/common/compUtils.ts @@ -325,3 +325,38 @@ export function stringIsNull(str) { // 两个 == 可以同时判断 null 和 undefined return str == null || str === 'null' || str === 'undefined'; } + +/** + * 【组件多了可能存在性能问题】获取弹窗div,将下拉框、日期等组件挂载到modal上,解决弹窗遮盖问题 + * @param node + */ +export function getAutoScrollContainer(node: HTMLElement) { + let element: Nullable = node + while (element != null) { + if (element.classList.contains('scrollbar__view')) { + // 判断是否有滚动条 + if (element.clientHeight < element.scrollHeight) { + // 有滚动条时,挂载到父级,解决滚动问题 + return node.parentElement + } else { + // 无滚动条时,挂载到body上,解决下拉框遮盖问题 + return document.body + } + } else { + element = element.parentElement + } + } + // 不在弹窗内,走默认逻辑 + return node.parentElement +} + +/** + * 判断子菜单是否全部隐藏,如果子菜单全部隐藏则隐藏父菜单 + * @param menuTreeItem + */ +export function checkChildrenHidden(menuTreeItem){ + if(!menuTreeItem.children){ + return false + } + return menuTreeItem.children?.find((item) => item.hideMenu == false) != null; +}