main-web/src/layouts/components/sidebar/useOpenKeys.ts

46 lines
1.3 KiB
TypeScript

import { ref, watch, computed, unref } from 'vue'
import { useRoute } from 'vue-router'
import { urlToList } from './utils'
import { useStore } from 'vuex'
export default function (props: { mainMenu: boolean }) {
const route = useRoute()
const store = useStore()
function getDefaultOpenKeys(path: string) {
return urlToList(path)
}
const { mainMenu } = props
const collapsed = computed(() => store.state.app.isCollapsed)
const openKeys = ref(getDefaultOpenKeys(route.path))
if (mainMenu) {
watch(
() => route.path,
() => {
if (unref(collapsed)) return
openKeys.value = getDefaultOpenKeys(route.path)
}
)
watch(collapsed, () => {
if (!collapsed.value) openKeys.value = getDefaultOpenKeys(route.path)
})
}
// 处理菜单数据,只保持一个子菜单展开
const handleOpenChange = (openKey: string[]) => {
const result: string[] = []
if (openKey.length) {
const lastOpenKey = [...openKey].pop() as string
openKey.forEach(item => {
// 子菜单打开父菜单也需要展开 || 父菜单展开之前缓存的子菜单数据也要展开
if (lastOpenKey.includes(item) || item.includes(lastOpenKey)) {
result.push(item)
}
})
}
openKeys.value = result
}
return {
openKeys,
handleOpenChange
}
}