iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何在Vue 3中扩展Vue Router链接详解
  • 392
分享到

如何在Vue 3中扩展Vue Router链接详解

2024-04-02 19:04:59 392人浏览 薄情痞子
摘要

前言 <router-link> 标签是一个很好的工具,可以在你的Vue应用程序的不同页面之间进行导航,但当导航到一个外部链接时,它不是一个工具,为此,你应该使用一个普通

前言

<router-link> 标签是一个很好的工具,可以在你的Vue应用程序的不同页面之间进行导航,但当导航到一个外部链接时,它不是一个工具,为此,你应该使用一个普通的<a> 标签。也许这只是我的问题,但很多时候,我都懒得去理会这其中的差别。其他时候,链接可能是动态的,也就是说,来自数据库或一些用户提供的数据源。在这种情况下,你根本不知道这个链接是外部的还是内部的,而且在每个可能使用这个链接的地方手动做V-if是多么痛苦的事情。

如果只是用一个单一的组件来处理所有的内部和外部链接,那不是很好吗?如果你和我一样,你现在就会这样做。

值得庆幸的是,扩展<router-link> 组件是非常简单的,只需将其包装在你自己的自定义组件中。让我们开始吧!让我们建立一个AppLink 组件,它可以处理任何链接,无论是外部还是内部。

AppLink组件

我们应该做的第一件事是让我们的AppLink组件接受所有与路由器链接相同的道具。为什么?这样我们的组件的 "接口 "就可以模仿Router Link的接口,我们就不会有另一个api需要记住。我们可以通过从Vue Router中导入RouterLink,并将它的props分散到我们组件的props选项中来实现。


// AppLink.vue
<script>
import {RouterLink} from 'vue-router'
export default{
  props:{ ...RouterLink.props }
}
</script>

在模板区,我们现在可以创建一个路由器链接标签,并将我们组件的所有道具绑定到它。我们还需要传入插槽,以便标签之间提供的文本和标记将出现在路由器链接中。


// AppLink.vue
<template>
  <router-link v-bind="$props"><slot /></router-link>
</template>

就像现在这样,我们已经处理了所有的内部链接。那么,外部链接呢?如前所述,外部链接使用a 标签,所以让我们把它添加到我们的模板中。像路由器链接一样,我们应该传递槽。让我们也把href 绑定到to 属性。


// AppLink.vue
<template>
  <a :href="to" rel="external nofollow"  rel="external nofollow" ><slot/></a>
  <router-link v-bind="$props"><slot/></router-link>
</template>

酷,这就说明了内部链接和外部链接!在这一点上,可能值得注意的是,上述方法只适用于Vue 3,因为它包含了超过1个根元素)。

现在,我们只需要一个条件来告诉我们提供给AppLink的是什么类型的链接。我们可以创建一个名为isExternal 的计算属性来确定这一点。首先,我们要检查我们的to道具的值是否是一个字符串。这是必要的,因为to 道具可能是一个对象,比如有时传递给router-link (即:to="{name:'RouteNameHere'}" )。然后,我们将检查该字符串是否以Http 的字符串开始。如果这两个条件都是真的,那么我们就有了自己的一个外部链接。


// AppLink.vue
<script>
export default{
   //...
  computed:{
    isExternal(){
      return typeof this.to === 'string' && this.to.startsWith('http')
    }
  }
}
</script>

router-link在模板区,我们现在可以在一个v-if中使用isExternal 计算的道具,当它是a ,否则就显示true 。


// AppLink.vue
<template>
  <a v-if="isExternal" :href="to" rel="external nofollow"  rel="external nofollow" ><slot/></a>
  <router-link v-else v-bind="$props"><slot/></router-link>
</template>

就这样了!我们完成了!在你的应用程序中全局注册该组件后,你现在可以像这样使用它。


// Anywhere in your app
<AppLink :to="[external-or-internal-link]">Click Me</AppLink>

进一步的灵活性

在新标签页中打开

让我们把AppLink 组件变得更加有用。比方说,我们希望所有的外部链接总是在新的标签页中打开。很简单。只要在组件中的<a> 标签上添加一个target="_blank" ,整个网站的所有外部链接现在都在新标签中打开。


// AppLink.vue
<template>
  <a ... target="_blank"><slot/></a>
  ...
</template>

这是你可能希望适用于你网站上大多数外部链接的规则,但如果你希望任何特定的外部链接在同一标签中打开,你可以用html目标属性告诉该链接实例这样做。


<AppLink :to="https://vueschool.io" target="_self">Vue School</AppLink>

链接安全

当你使用target="_blank" 属性链接到另一个网站上的一个页面时,你最终会使你的网站暴露在性能和安全问题中。

  • 被链接的页面可能最终与你的页面在同一进程中运行。根据被链接页面的情况,这可能会降低你自己页面的速度。
  • 另一个页面也可以通过window.opener 属性访问原始页面window ,造成安全问题。

关于这个问题的更多细节,请看这个信息性的帖子。

解决这个问题的办法是为你所有的外部链接标签提供一个rel="noopener" 属性。但要记住这样做是多么痛苦啊......哦,等等......我们不需要这样做。我们可以在我们的AppLink 组件中添加一次,就可以了。


// AppLink.vue
<template>
  <a ... rel="noopener"><slot/></a>
  ...
</template>

外部链接的独特风格

我看到一些网站在其网站上的外部链接的样式与通往他们自己网站上其他地方的链接有点不同。这可以帮助用户更好地了解他们是如何在一个他们原本没有访问过的网站上结束的。它可以是任何东西,从链接旁边的一个微妙的 "外部链接 "图标到链接下面的一个小警告,比如说 "链接到第三方网站"。在我们的组件中实现这一点很简单,只要在我们的模板中的a 标签上添加一个external-link 类,然后用CSS来改变它的风格,或者添加一个:after sudo-element。你甚至可以为外部链接添加全新的元素,比如一个字体超赞的图标。


// AppLink.vue
// (must have font awesome font included in project)
<template>
  <a ... class="external-link">
    <slot/> <i class="fas fa-external-link-alt"></i>
  </a>
  ...
</template>

<style scoped>
.external-link i {
  font-size: 0.8em;
  opacity: 0.7;
}
</style>

总结

这只是你可以扩展router-link以适应常见和特殊情况下的需求的一个尝试。另外,由于你的所有链接都被封装在一个单一的组件中,你可以很容易地更新你所有链接的不同方面。你能想到任何其他有用的方法来改进我们的AppLink 组件吗?你是否在你的应用程序中使用类似的方法,并有一些智慧可以分享?

到此这篇关于如何在Vue 3中扩展Vue Router链接的文章就介绍到这了,更多相关vue3扩展Vue Router链接内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何在Vue 3中扩展Vue Router链接详解

本文链接: https://www.lsjlt.com/news/129342.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在Vue 3中扩展Vue Router链接详解
    前言 <router-link> 标签是一个很好的工具,可以在你的Vue应用程序的不同页面之间进行导航,但当导航到一个外部链接时,它不是一个工具,为此,你应该使用一个普通...
    99+
    2024-04-02
  • vue如何与Vue Router深度链接
    小编给大家分享一下vue如何与Vue Router深度链接,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!与 Vue Router 深度链接你可以在 URL 中存储(一些)状态,允许你直接跳转到页面上的特定状态。比如你可以加...
    99+
    2023-06-27
  • Vue中如何在新窗口打开页面及使用Vue-router
    这篇文章将为大家详细讲解有关Vue中如何在新窗口打开页面及使用Vue-router,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景在开发提分加项目的过程中,遇到了点击下...
    99+
    2024-04-02
  • 详解eslint在vue中如何使用
    目录1、说明2、下载相关依赖包3、配置文件.eslintrc.js(还有其他方式配置规则)4、在vscode(版本1.44.0)配置保存时自动格式化代码5、在package.json...
    99+
    2024-04-02
  • 如何在vue-cli 3中使用vue-bootstrap-datetimepicker日期插件
    这期内容当中小编将会给大家带来有关如何在vue-cli 3中使用vue-bootstrap-datetimepicker日期插件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先,需要安装插件的依赖项,包...
    99+
    2023-06-06
  • 在vue-cli脚手架中如何配置一个vue-router前端路由
    小编给大家分享一下在vue-cli脚手架中如何配置一个vue-router前端路由,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!...
    99+
    2024-04-02
  • 详解在Vue中如何使用provide与inject
    目录provide()函数inject()函数总结在vue2.0里面provide与inject是以选项式(配置)API的方式在组件中进行使用的,解决的是跨组件(祖孙)间通信的一种方...
    99+
    2023-03-20
    Vue使用provide inject Vue provide inject
  • vue-router中重定向不刷新问题如何解决
    这期内容当中小编将会给大家带来有关vue-router中重定向不刷新问题如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前阵子太忙了,自己一个人一边开发着新项目,一...
    99+
    2024-04-02
  • 详解如何在Vue中动态添加类名
    目录静态和动态类有条件的类名使用数组语法使用对象语法与自定义组件一起使用快速生成类名使用计算属性来简化类能够向组件添加动态类名是非常强大的功能。它使我们可以更轻松地编写自定义主题,根...
    99+
    2024-04-02
  • vue如何在v-for中解构
    小编给大家分享一下vue如何在v-for中解构,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在 v-for 中解构你知道你可以在 v-for ...
    99+
    2023-06-27
  • 详解如何实现在Vue中导入Excel文件
    目录一、安装依赖二、template中三、script中js代码以将此Excel导出为json数据为例 一、安装依赖 npm install file-saver --save n...
    99+
    2024-04-02
  • vue第三方库中存在扩展运算符报错问题的解决方案
    目录vue第三方库中存在扩展运算符报错问题解决方案1、引入babel依赖2、在vue项目的src/.babelrc文件中(没有自己创建)下修改解决方法:vue第三方库中存在扩展运算符...
    99+
    2024-04-02
  • 如何在 PHP 和 Django 中实现可扩展的接口架构?
    在当今快速发展的互联网时代,构建一个可扩展的接口架构是非常重要的。PHP 和 Django 是两种非常流行的Web开发框架,他们都拥有强大的功能和丰富的生态系统。在本文中,我们将讨论如何在 PHP 和 Django 中实现可扩展的接口架构。...
    99+
    2023-06-13
    django 并发 接口
  • Vue如何接入hls/m3u8的直播视频详解
    目录前言互联网网络流媒体简介播放HLS格式的视频安装实现坑总结前言 最近做了一个后台系统,需要调取工厂监控视频流显示在前端的页面上,其中遇到了一些坑,在这里做个记录,希望对前端小伙伴...
    99+
    2024-04-02
  • vue如何在style标签中使用变量(数据)详解
    目录在 style 中使用 data 变量那么如何在代码中使用style属性呢?总结参考资料 SFC CSS Features | Vue.js 在 style 中使用 data 变...
    99+
    2024-04-02
  • vue-cli在ie9+中无效如何解决
    本文小编为大家详细介绍“vue-cli在ie9+中无效如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue-cli在ie9+中无效如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ie9+报错vue...
    99+
    2023-07-04
  • Vue中如何定义数据示例详解
    前言 在开发的过程中,定义变量是一件非常高频且十分基础的事情,如何合理的根据变量的使用场景和作用域范围进行定义变量,是一件很小缺很容易犯错的事情 Vue2已经流行使用了这么多年,多数...
    99+
    2024-04-02
  • Vue和uniapp中该如何使用canvas详解
    目录Vue与uniapp中如何使用canvas?示例属性说明注意事项:总结Vue与uniapp中如何使用canvas? 一般Vue情况下我们使用canvas是这样使用的 //创建ca...
    99+
    2022-11-13
    uni-app vue uniapp使用canvas vue uniapp canvas
  • 一文详解如何在vue中实现文件预览功能
    目录文件流docx的预览pdf的预览xlsx预览图片的预览结语文件流 如何将各种文件的文件流(blob)转化为线上可以直接预览的数据,这里简单介绍四种不同类型的文件预览。分别是pdf...
    99+
    2022-11-13
    vue实现预览多种文件 vue文件预览功能 vue实现文件预览
  • 在Vue页面中如何更优雅地引入图片详解
    目录错误示范通过computed当图片不变的时候直接引入通过css变量切换图片通过css绘制总结在我们写vue项目中肯定会用到各种图片,那么如何更好的使用图片资源呢。这里我讲一下我常...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作