vue-router实现原理(在Vue3中封装一个)
vue-router实现原理(在Vue3中封装一个)
2024-11-22 04:51:03  作者:阿桃女士  网址:https://m.xinb2b.cn/know/rwu128155.html

<router-link> 标签是用于在Vue应用程序的不同页面之间跳转,但它不是跳转到外部链接,相反,我们一般使用 <a> 标签。

也许只有我这么认为,但很多时候,我无法跟上这种差异。其他时候,链接可能是动态的,即来自数据库或用户提供的某个数据源。在这种情况下,你根本不知道链接是外部的还是内部的,在每个可能使用链接的地方手动做一个v-if是多么痛苦。

如果只用一个组件来处理所有内部和外部的链接,那不是很好吗?

幸运的是,扩展<router-link>组件非常简单,只需将它包装到我们自己的定制组件中。Ok,我们需要构建一个AppLink组件来处理链接,无论是外部的还是内部的。

AppLink组件

AppLink组件的 props 要包含 router-link 的所有 props。为什么?因为这样我们组件的“接口”就可以模仿 Router Link 的接口,无需再记住另一个API。我们可以通过从Vue Router导入 RouterLink 并将其 props 解构到我们的组件中,如下所示:

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

在 template 中,创建 router-link 并将 props 传递给它,我们还需要传入slot ,这个可以在 router-link 插入内容。

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

到目前为止,我们已经处理了所有内部链接,那外部链接呢?如前所述,外部链接使用a标签,因此我们将其添加到template中。像 router link 一样,并将传入的 to 值赋值给 href。

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

这样内部和外部链接都有了对应的处理,需要注意的是,以上内容仅适用于 Vue3,因为它包含多个根元素。

现在,我们需要一个计算属性来告诉AppLink使用哪种链接,我们先取名为isExternal。

首先,我们检查prop的值是否为字符串。这是必需的,因为to属性可能是一个对象,例如有时传递到router-link(即::to="{name:'RouteNameHere'}")。然后,我们将查字符串是否以http字符串开头。如果这两个条件都成立,那么就判断是一个外部链接。

//AppLink.vue<script>exportdefault{//...computed:{isExternal(){returntypeofthis.to==='string'&&this.to.startsWith('http')}}}</script>

有了 isExternal计算属性之后,我们就可以使用 v-if 来进行操作,如下所示:

//AppLink.vue<template><av-if="isExternal":href="to"><slot/></a><router-linkv-elsev-bind="$props"><slot/></router-link></template>

大功告成,我们可以这样来使用 AppLink 组件。

//Anywhereinyourapp<AppLink:to="[external-or-internal-link]">ClickMe</AppLink>


更高的灵活性在新窗口中打开

我们可以多添加一些常用的功能。例如,我们希望外部链接都在新窗口中打开,这样很简单就能做到了,只要把 target="_blank" 添加到我们的 a 标签中即可。

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

当然,有些外部链接不需要在新窗口中打开,我们可以通过指定 target 来告诉组件内部打开链接的方式,如下所示:

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

链接安全

当我们使用target="_blank"属性链接到另一个站点上的页面时,最终可能使我们的站点面临性能和安全性问题:

链接到的页面最终可以在与页面相同的进程上运行。根据所链接页面的最新情况,这可能会使您自己的页面变慢。另一个页面也可以通过window.opener属性访问原始页面窗口,从而引起安全隐患。

解决此问题的方法是为所有外部链接标签添加rel="noopener"属性,因为我们已经封装成组件了,所以只需要在组件内部的 a 标签添加即可。

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

外部链接的独特样式

我见过一些网站在他们的网站上设置的外部链接样式与在他们自己的网站上指向站内的链接有点不同。这可以帮助用户更好地理解他们要跳转的是外部链接。

这个样式可以是任何东西,如,在第三方链接加个警告的图标,告诉用户跳转的风险。在我们的组件中实现这一点非常简单,只需在模板中的a标签中添加一个external-link类,然后使用css对其进行不同的样式化:

//AppLink.vue//(musthavefontawesomefontincludedinproject)<template><a...class="external-link"><slot/><iclass="fasfa-external-link-alt"></i></a>...</template><stylescoped>.external-linki{font-size:0.8em;opacity:0.7;}</style>

这里就把 AppLink 思路讲完了,当然,大家需要新的需求可以自行扩展。

~完,我是小智,看海贼王去了,下期见!

作者:Written by Daniel Kelly 译者:前端小智 来源:vueschool

https://vueschol.io/articles/vuejs-tutorials/extendig-vue-router-links-in-vue-3/

  • 到什么程度才下胃管(手术前为什么要下胃管呢)
  • 2024-11-22手术前为什么要下胃管呢手术前为什么要下胃管呢?很多手术患者术前都需要留置一根胃管,一听到下胃管,很多人都面露惊色和恐惧,浑身都很抗拒,同时也很疑惑,我为什么要下胃管呢,这根胃管的作用是什么呢??什么是胃管?胃管是由鼻腔缓缓。
  • 产后一年怎样快速减肥(好心态慢慢减肥)
  • 2024-11-22好心态慢慢减肥PS:分享一篇广州肥胖研究中心产后瘦身经历吧胖的人心里的苦楚,辛酸与难过,只有自己能体会,旁人无人可懂我不是什么专业的大V,写的不是很专业毕竟也是在减肥路上走了很久,写这么多只是想把自己的经验分享给受。
  • 小干鲍鱼家常做法爆炒(小鲍鱼在锅里扒拉扒拉炒一炒真好吃)
  • 2024-11-22小鲍鱼在锅里扒拉扒拉炒一炒真好吃酱爆小鲍鱼是一道特色菜肴属于鲁菜系,主要材料为小鲍鱼、豆瓣酱其口味咸鲜,做法简单,营养丰富广受人们的喜爱下面我就把酱爆小鲍鱼的做法分享给大家,希望大家喜欢材料:小鲍鱼,葱,姜,蒜,香菜,花生油,豆瓣酱。
  • lcs本周预测(LC时代十八位黄金级排名)
  • 2024-11-22LC时代十八位黄金级排名众所周知,圣斗士星矢有一个不成文的定律,那就是新人一定打不过老人在SS时代,哪怕有着撒加、沙加这种天才型选手,依然只能和上一届圣战的两位黄金(史昂、童虎)打个平手所以在圣斗士冥王神话篇(LC)诞生后,。
  • 侧着身子玩手机有什么危害吗 专家教你如何玩手机
  • 2024-11-22侧着身子玩手机有什么危害吗 专家教你如何玩手机智能手机已经成为现代人日常生活和工作的必需品,但是随之而来的也是人们在使用手机时忽略的身体问题最近,“千万不要侧躺玩手机”的话题引起了大家的关注侧躺状态下使用手机不仅会对眼睛造成极大的负担,还会对下方。
  • 百世快递会变成极兔吗(百世快递没活过百世)
  • 2024-11-22百世快递没活过百世伯虎点睛:2017年5月,百世上市前,周韶宁在全球智慧物流峰会上说:“干得很累”熬过了2020的厮杀,却没熬过2021的最后两个月百世,这个在中国存在了15年,阿里持股比例最多的物流公司,最终在202。
  • 如何判断一只正宗的英短猫(如何判断英短猫)
  • 2024-11-22如何判断英短猫英短猫很早就进入了中国市场,在国内一直都很受欢迎如果想要养一只英短猫,应该如何判断它的品相好坏呢?学会看以下这几个部位,你也可以是行家!1、看尾巴特征:很粗且很圆想要判断一只英短猫的品相好不好,可以学。
  • 飞碟唱片公司有哪些歌手(即使您不了解飞碟唱片)
  • 2024-11-22即使您不了解飞碟唱片飞碟唱片10首高传唱度歌曲2014年,华纳唱片为了安放一代人的青春记忆,“复出”了当年红极一时的厂牌——飞碟然而,关于飞碟唱片的最好时代,其实在飞碟创始人彭国华出走并创办丰华唱片就已结束就是说,最好的。
  • 要嫁就嫁灰太狼歌曲原唱女声(要嫁就嫁灰太狼)
  • 2024-11-22要嫁就嫁灰太狼各位未婚的女同志,你们找老公的标准是什么?我觉得,灰太狼是最好的标准,1、爱老婆胜过爱自己2、热爱劳动3、聪明能干有毅力4、动手能力强5、为老婆花钱从不心疼6、从不花心,对老婆从一而终7、从不和老婆讨。
  • 女演员拍戏生理反应(演员拍戏有生理反应会不会尴尬)
  • 2024-11-22演员拍戏有生理反应会不会尴尬演员是一个很多人向往的职业,因为在外人眼里,工作轻松、来钱快,演好了有人捧!但现实却没那么容易!虽说演员不会像大众那么辛苦,但也不容易!演员为了赶场会满世界飞,有时候因为演戏需求夏天盖棉袄、冬天挂背心。
  • 一骑红尘妃子笑拼音怎么读(一骑红尘妃子笑)
  • 2024-11-22一骑红尘妃子笑读者在新疆乌鲁木齐新华国际图书城选购古诗词书籍张秀科摄光明图片/视觉中国刚刚过去的春节假期,《中国诗词大会》再次在黄金时段热播在节目中,“日月被光泽”的“被”字被读成了“pī”,引起了社会的广泛关注吉。
  • 非人哉最初的名字(非人哉里名字奇怪的角色太多了)
  • 2024-11-22非人哉里名字奇怪的角色太多了诸位朋友的名字,是挺普通还是很难念呢?我自己读书的时候,班上的同学们名字都挺普通的,没有那种名字很难念的人,而且班上基本上还有诸如“张伟”、“王杰”、“李静”一类大众名字的同学不过听说现在新一代的父母。