> index.vue
< template>
< div :class = " {' has-logo' :showLogo}" > < logo v-if = " showLogo" :collapse = " isCollapse" /> < el-scrollbar wrap-class = " scrollbar-wrapper" > < el-menu:default-active = " activeMenu" :collapse = " isCollapse" :background-color = " variables.menuBg" :text-color = " variables.menuText" :unique-opened = " false" :active-text-color = " variables.menuActiveText" :collapse-transition = " false" mode = " vertical" > < sidebar-item v-for = " route in permission_routes" :key = " route.path" :item = " route" :base-path = " route.path" /> el-menu> el-scrollbar> div>
template> < script>
import { mapGetters } from 'vuex'
import Logo from './Logo'
import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss' export default { components: { SidebarItem, Logo } , computed: { ... mapGetters ( [ 'permission_routes' , 'sidebar' ] ) , activeMenu ( ) { const route = this . $routeconst { meta, path } = routeif ( meta. activeMenu) { return meta. activeMenu} return path} , showLogo ( ) { return this . $store. state. settings. sidebarLogo} , variables ( ) { return variables} , isCollapse ( ) { return ! this . sidebar. opened} }
}
script>
> Item.vue
< script>
export default { name: 'MenuItem' , functional: true , props: { icon: { type: String, default : '' } , title: { type: String, default : '' } } , render ( h, context ) { const { icon, title } = context. propsconst vnodes = [ ] if ( icon) { if ( icon. includes ( 'el-icon' ) ) { vnodes. push ( < i class = { [ icon, 'sub-el-icon' ] } / > ) } else { vnodes. push ( < svg- icon icon- class = { icon} / > ) } } if ( title) { vnodes. push ( < span slot= 'title' > { ( title) } < / span> ) } return vnodes}
}
script> < style scoped >
.sub-el-icon { color : currentColor; width : 1em; height : 1em;
}
style>
> SidebarItem.vue
< template> < div v-if = " !item.hidden" > < template v-if = " hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow" > < app-link v-if = " onlyOneChild.meta" :to = " resolvePath(onlyOneChild.path)" > < el-menu-item :index = " resolvePath(onlyOneChild.path)" :class = " {' submenu-title-noDropdown' :!isNest}" > < item :icon = " onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" :title = " onlyOneChild.meta.title" /> el-menu-item> app-link> template> < el-submenu v-else ref = " subMenu" :index = " resolvePath(item.path)" popper-append-to-body > < template slot = " title" > < item v-if = " item.meta" :icon = " item.meta && item.meta.icon" :title = " item.meta.title" /> template> < sidebar-itemv-for = " child in item.children" :key = " child.path" :is-nest = " true" :item = " child" :base-path = " resolvePath(child.path)" class = " nest-menu" /> el-submenu> div>
template> < script>
import path from 'path'
import { isExternal } from '@/utils/validate'
import Item from './Item'
import AppLink from './Link'
import FixiOSBug from './FixiOSBug' export default { name: 'SidebarItem' , components: { Item, AppLink } , mixins: [ FixiOSBug] , props: { item: { type: Object, required: true } , isNest: { type: Boolean, default : false } , basePath: { type: String, default : '' } } , data ( ) { this . onlyOneChild = null return { } } , methods: { hasOneShowingChild ( children = [ ] , parent ) { const showingChildren = children. filter ( item => { if ( item. hidden) { return false } else { this . onlyOneChild = itemreturn true } } ) if ( showingChildren. length === 1 ) { return true } if ( showingChildren. length === 0 ) { this . onlyOneChild = { ... parent, path: '' , noShowingChildren: true } return true } return false } , resolvePath ( routePath ) { if ( isExternal ( routePath) ) { return routePath} if ( isExternal ( this . basePath) ) { return this . basePath} return path. resolve ( this . basePath, routePath) } }
}
script>
> Link.vue
< template> < component :is = " type" v-bind = " linkProps(to)" > < slot /> component>
template> < script>
import { isExternal } from '@/utils/validate' export default { props: { to: { type: String, required: true } } , computed: { isExternal ( ) { return isExternal ( this . to) } , type ( ) { if ( this . isExternal) { return 'a' } return 'router-link' } } , methods: { linkProps ( to ) { if ( this . isExternal) { return { href: to, target: '_blank' , rel: 'noopener' } } return { to: to} } }
}
script>
> FixiOSBug.js
export default { computed: { device ( ) { return this . $store. state. app. device} } , mounted ( ) { this . fixBugIniOS ( ) } , methods: { fixBugIniOS ( ) { const $subMenu = this . $refs. subMenuif ( $subMenu) { const handleMouseleave = $subMenu. handleMouseleave$subMenu. handleMouseleave = ( e ) => { if ( this . device === 'mobile' ) { return } handleMouseleave ( e) } } } }
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】 进行投诉反馈!