|
|
@@ -10,6 +10,8 @@ import { cloneDeep } from 'lodash-es'
|
|
|
import { filterMenusPath, initTabMap, tabPathMap } from './helper'
|
|
|
import { useDesign } from '@/hooks/web/useDesign'
|
|
|
import { isUrl } from '@/utils/is'
|
|
|
+import { getCenteredScrollTop } from '@/layout/components/Menu/src/helper'
|
|
|
+import { useScrollTo } from '@/hooks/event/useScrollTo'
|
|
|
|
|
|
const { getPrefixCls, variables } = useDesign()
|
|
|
|
|
|
@@ -34,6 +36,25 @@ export default defineComponent({
|
|
|
|
|
|
const tabRouters = computed(() => unref(routers).filter((v) => !v?.meta?.hidden))
|
|
|
|
|
|
+ const scrollbarRef = ref<ComponentRef<typeof ElScrollbar>>()
|
|
|
+
|
|
|
+ const scrollActiveMenuToCenter = async () => {
|
|
|
+ await nextTick()
|
|
|
+ const wrap$ = unref(scrollbarRef)?.wrapRef
|
|
|
+ const activeMenuItem = wrap$?.querySelector<HTMLElement>(`.${prefixCls}__item.is-active`)
|
|
|
+ if (!wrap$ || !activeMenuItem) return
|
|
|
+
|
|
|
+ const { start } = useScrollTo({
|
|
|
+ el: wrap$,
|
|
|
+ position: 'scrollTop',
|
|
|
+ to: getCenteredScrollTop(wrap$, activeMenuItem),
|
|
|
+ duration: 300
|
|
|
+ })
|
|
|
+ start()
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(scrollActiveMenuToCenter)
|
|
|
+
|
|
|
const setCollapse = () => {
|
|
|
appStore.setCollapse(!unref(collapse))
|
|
|
}
|
|
|
@@ -71,6 +92,8 @@ export default defineComponent({
|
|
|
}
|
|
|
)
|
|
|
|
|
|
+ watch(() => unref(currentRoute).fullPath, scrollActiveMenuToCenter, { flush: 'post' })
|
|
|
+
|
|
|
const showTitle = ref(true)
|
|
|
|
|
|
watch(
|
|
|
@@ -145,9 +168,8 @@ export default defineComponent({
|
|
|
'w-[var(--tab-menu-min-width)]': unref(collapse)
|
|
|
}
|
|
|
]}
|
|
|
- onMouseleave={mouseleave}
|
|
|
- >
|
|
|
- <ElScrollbar class="!h-[calc(100%-var(--tab-menu-collapse-height))]">
|
|
|
+ onMouseleave={mouseleave}>
|
|
|
+ <ElScrollbar ref={scrollbarRef} class="!h-[calc(100%-var(--tab-menu-collapse-height))]">
|
|
|
<div>
|
|
|
{() => {
|
|
|
return unref(tabRouters).map((v) => {
|
|
|
@@ -170,8 +192,7 @@ export default defineComponent({
|
|
|
]}
|
|
|
onClick={() => {
|
|
|
tabClick(item)
|
|
|
- }}
|
|
|
- >
|
|
|
+ }}>
|
|
|
<div>
|
|
|
<Icon icon={item?.meta?.icon}></Icon>
|
|
|
</div>
|
|
|
@@ -189,8 +210,7 @@ export default defineComponent({
|
|
|
`${prefixCls}--collapse`,
|
|
|
'text-center h-[var(--tab-menu-collapse-height)] leading-[var(--tab-menu-collapse-height)] cursor-pointer'
|
|
|
]}
|
|
|
- onClick={setCollapse}
|
|
|
- >
|
|
|
+ onClick={setCollapse}>
|
|
|
<Icon icon={unref(collapse) ? 'ep:d-arrow-right' : 'ep:d-arrow-left'}></Icon>
|
|
|
</div>
|
|
|
<Menu
|
|
|
@@ -203,8 +223,7 @@ export default defineComponent({
|
|
|
'!w-0': !unref(showMenu) && !unref(fixedMenu)
|
|
|
}
|
|
|
]}
|
|
|
- style="transition: width var(--transition-time-02), left var(--transition-time-02);"
|
|
|
- ></Menu>
|
|
|
+ style="transition: width var(--transition-time-02), left var(--transition-time-02);"></Menu>
|
|
|
</div>
|
|
|
)
|
|
|
}
|