vue-router实现原理(在Vue3中封装一个)
vue-router实现原理(在Vue3中封装一个)
2024-11-22 10:41:21  作者:阿桃女士  网址:https://m.xinb2b.cn/sport/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-23三娘教子寓意是什么母亲养育子女成人非常不容易,子女应该牢记并报答父母养育之恩;做人不能只图眼前利益,只要超常付出就会有超常回报《三娘教子》是由中国台湾导演唐美云执导,高庸编剧,唐美云、许秀年、王彩桦、黄西田、安迪、陈小。
  • 小学借读可以留级吗(重磅解读小初高转学)
  • 2024-11-23重磅解读小初高转学最近有很多家长咨询插班转学的事情其实无论是转学、休学、跳级、留级等等都是学籍管理的范围学籍管理也分为义务教育学籍管理和高中阶段(非义务教育)的学籍管理今天,分别跟大家说一说:1、在小学、初中阶段转学、。
  • 湖南的湘南湘北是哪些城市?北纬三十度常德
  • 2024-11-23湖南的湘南湘北是哪些城市?北纬三十度常德常德:北纬28°24′31″——北纬30°07′53″晋太元中,武陵人捕鱼为业缘溪行,忘路之远近忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷渔人甚异之,复前行,欲穷其林林尽水源,便得一山,山有。
  • 广州动物园啥时候开放(63岁的广州动物园)
  • 2024-11-2363岁的广州动物园广州动物园对于大部分广州人来说都是一个充满回忆的地方科普性强、门票价格亲民直到现在依然是大家周末的游玩胜地这段时间一则关于广州动物园的新闻又走到了大众的关注点上广州动物园又被提议搬迁!在广州市政协十三。
  • 书读百遍其义自明可以吗(书读百遍其义自见)
  • 2024-11-23书读百遍其义自见关于读书,有一句话在我们的学生时代特别有名,那就是“书读百遍,其义自见”意思是读书读得多了,书中之义就自然出现,不待讲解,即明其义矣至少在我上学的时候,这句话在各种语文教材和历任语文老师那里出现了无数。
  • 红楼梦贾琏二姐被凤姐发现(红楼梦凤姐导演官司)
  • 2024-11-23红楼梦凤姐导演官司督察院的衙门朝谁开吃了原稿吃被告成为王熙凤手里掌控的工具【故事和原文】 凤姐打听明白尤二姐的具体情况后,果然有个未婚夫张华,父亲得了二十两退亲银子,张华不知道凤姐给旺儿二十两银子,让他挑唆张华告贾琏,。
  • 可爱搞怪的谐音梗昵称(可爱搞怪)
  • 2024-11-23可爱搞怪「可爱搞怪谐音梗」1.我去买生蚝回家的路上生蚝全都跳下袋子钻到了泥土里原来这就叫蚝喜欢泥2.孩子问妈妈,为什么蜡烛的火苗一窜一窜的就不能消停一会吗,妈妈说因为这是精神小火3.家里有罐茶不知道放了多久刚。
  • 地球上最臭的花是什么花(世界上最臭的花真脆弱)
  • 2024-11-23世界上最臭的花真脆弱世上最高、最臭的花来自苏门答腊岛的雨林之中这种在印度尼西亚被称作“腐尸花”的魔芋属植物,能够散发出一种可以与垃圾或腐肉的恶臭“相媲美”的臭味这种花人工培植的难度很大,每三年开放一次,一经开放,会在8个。
  • 妈妈微信网名(妈妈微信网名有哪些)
  • 2024-11-23妈妈微信网名有哪些别扭的可爱ˇ一饮茶尽若愛只如初見久拥深怀泛黄的咖啡店俗野.跟紧步伐几杯薄酒薄荷加冰要多心凉夏末未央萌态尤物猫耳朵胡同巷扑啦猫~wёл小任性﹌梧桐林的猫女巫软妹的小情书大萌女i萌奶薄荷牛奶萌萌萌的夏天。
  • 桂花香金秋九月(上海的秋天是桂花味的)
  • 2024-11-23上海的秋天是桂花味的近日,上海的桂花全面盛放本文图片均为“绿色上海”微信号图“满城桂花香”“隔着口罩都能闻到桂花香气”“秋高气爽,桂花飘香,最好的季节大抵如此”“上海的秋天是桂花味的”……近几日,上海街头弥漫着桂花香,金。
  • 美国r标和tm标的区别(科普R标TM标)
  • 2024-11-23科普R标TM标之前已经为大家介绍过一些商标知识,不知道大家是否还记得呢?这次继续为大家科普商标知识找不同这两个商标还是有着很大区别的,相信大家一眼就能发现重点了一个是“TM标”,一个是“R标”它们究竟有什么不同呢?。