如何让Vue RouteLink跳转到外链(其他网站)

背景

根据 百度谷歌, 我们知道如果要在Vue项目中跳转其他网站, 只能通过<a>标签, 而RouteLink组件只能跳转相对路径.

所以如果要跳转外链, 只能写死<a>, 但在我的项目中, Path是一个变量, 它可能是本网站(相对路径), 也可能是外链, 如http://baidu.com, 所以没办法再代码中写死用<a>或者<router-link>.

最后写出的代码可能是这样的:

<router-link v-if="path==='http://baidu.com'" :to="{path: path}">
这是子组件
</router-link>
<a v-else :href="path">
这是子组件
</a>

咋一看没问题, 但是会发生重复编写此子组件代码的问题, 不是最佳解决方案.

那么RouterLink组件到底能不能实现跳转外链呢? 官方文档没有说那就再翻看源码, 也发现并不能, 所有只有自己实现了.

编写一个可以跳转外链的RouterLink

方法1: 可以自己再实现一次RouterLink, 虽然代码量不多, 但也算是重复代码了, 我们希望代码越少越好.

方法2: 包装一次RouterLink, 代码如下.

<!--
支持外链的RouterLink, 只需要包装一次默认的router-link.
-->
<template>
  <!-- 以斜杠/开头的路径会被判定为内链, 否则是外链 你可以自己修改此逻辑 -->
  <a v-if="to.path && to.path[0] !== '/'" :href="to.path" :target="target">
    <slot></slot>
  </a>
  <router-link v-else v-bind="vProps">
    <slot></slot>
  </router-link>
</template>
<script>
  export default {
    name: 'XRouterLink',
    props: {
      to: {
        type: Object,
        default: {path: '/'},
        required: true,
      },
      target: {
        type: String,
        default: ''
      },
    },
    computed: {
      vProps() {
        // https://cn.vuejs.org/v2/api/#vm-attrs
        // 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。
        // 当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。
        return {...this.$props, ...this.$attrs}
      }
    },
  }
</script>

使用这个组件

<!-- 内链, 点击之后在项目内跳转 -->
<XRouterLink to="/home"></XRouterLink>
<!-- 外链, 点击之后跳转到其他网站: 百度 -->
<XRouterLink to="https://baidu.com"></XRouterLink>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容