34 lines
630 B
Vue
34 lines
630 B
Vue
|
<template>
|
||
|
<component :is="type" v-bind="linkProps(to)">
|
||
|
<slot></slot>
|
||
|
</component>
|
||
|
</template>
|
||
|
|
||
|
<script setup lang="ts">
|
||
|
defineOptions({
|
||
|
name: "AppLink",
|
||
|
inheritAttrs: false,
|
||
|
});
|
||
|
|
||
|
import { isExternal } from "@/utils/index";
|
||
|
|
||
|
const props = defineProps({
|
||
|
to: {
|
||
|
type: String,
|
||
|
required: true,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
const isExternalLink = computed(() => isExternal(props.to));
|
||
|
|
||
|
const type = computed(() => {
|
||
|
return isExternalLink.value ? "a" : "router-link";
|
||
|
});
|
||
|
|
||
|
const linkProps = (to: string) => {
|
||
|
return isExternalLink.value
|
||
|
? { href: to, target: "_blank", rel: "noopener noreferrer" }
|
||
|
: { to };
|
||
|
};
|
||
|
</script>
|