47 lines
803 B
Vue
47 lines
803 B
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: {
|
||
path: to,
|
||
query: { menu: '1', _t: Date.now() } // 菜单入口标记,_t确保每次URL不同,触发组件更新
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</script>
|