You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.0 KiB

import Vue from 'vue'
import {debounce, isEmpty} from "@/util"
import {isMobile} from "@/util/browser"
import {createGetters, createMutations} from "@/util/observable"
const state = {
//区分pc和移动端
isMobile: isMobile(),
//设置抽屉的显隐
//放这里的原因是navbar可能会重新渲染,从而导致抽屉的重新渲染
showSettingDrawer: false,
//当前激活的顶部菜单的fullPath
activeRootMenu: '',
//所有的树形菜单,每个元素为顶部菜单,顶部菜单的子级(如果有)为侧边栏菜单
menus: [],
//导航模式,'aside'、'aside-two-part'、'head'、'mix'
navMode: 'mix'
}
const store = Vue.observable(state)
export const getters = createGetters(store)
export const mutations = {
...createMutations(store),
menus(v) {
sort(v)
store.menus = v
}
}
//菜单排序
function sort(routes) {
if (!Array.isArray(routes) || routes.length === 0) {
return
}
//菜单排序值的空值处理
const getSortValue = item => {
const sort = deepGetSortValue(item)
return isEmpty(sort) ? 10000 : sort
}
//获取菜单的排序值
const deepGetSortValue = item => {
const {children = [], meta: {hidden, sort} = {}} = item
if (hidden) return null
if (!isEmpty(sort)) return sort
//如果只有一个子节点,那么取子节点的排序值
if (children.length === 1) {
return deepGetSortValue(children[0])
}
return null
}
//对根节点排序
routes.sort((pre, next) => {
pre = getSortValue(pre)
next = getSortValue(next)
if (pre < next) return -1
if (pre === next) return 0
return 1
})
//对每一个根节点的子级排序
routes.forEach(route => {
const {children} = route
children && children.length && sort(children)
})
}
window.addEventListener('resize', debounce(() => {
!document.hidden && mutations.isMobile(isMobile())
}))