外部打开,是指浏览器 新开标签 打开,我们需要在点击菜单的时候,使用
window.open(url)
方式打开url,代码如下所示:
<template>
<el-sub-menu v-if="menu.children.length > 0" :key="menu.path" :index="menu.path">
<template #title>
<svg-icon v-if="showIcon" :icon="menu.meta.icon"></svg-icon>
<span>{{ menu.meta.title }}</span>
</template>
<menu-item v-for="sub in menu.children" :key="sub.path" :menu="sub"></menu-item>
</el-sub-menu>
<el-menu-item v-else :key="menu.path" :index="menu.path" @click="handleClickMenu(menu)">
<svg-icon v-if="showIcon" :icon="menu.meta.icon"></svg-icon>
<template #title>
{{ menu.meta.title }}
</template>
</el-menu-item>
</template>
<script setup lang="ts">
import { computed, PropType } from 'vue'
import { useRouter } from 'vue-router'
import store from '@/store'
import { isExternalLink, replaceLinkParam } from '@/utils/tool'
// 显示icon图标
const showIcon = computed(() => {
return store.appStore.theme.layout !== 'columns'
})
defineProps({
menu: {
type: Object as PropType<any>,
required: true
}
})
const router = useRouter()
// 菜单点击事件
const handleClickMenu = (menu: any) => {
// 不是新开页面,则直接切换路由
if (!menu.meta.newOpen) {
router.push(menu.path)
return
}
// 新开页面逻辑
if (isExternalLink(menu.meta.url)) {
// 外链
window.open(replaceLinkParam(menu.meta.url), '_blank')
} else {
// 内部组件
window.open('#' + menu.meta.url, '_blank')
}
}
</script>