vue-router实现原理(在Vue3中封装一个)
vue-router实现原理(在Vue3中封装一个)
2024-11-22 11:12:16  作者:阿桃女士  网址:https://m.xinb2b.cn/life/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汉字溃怎么组词崩溃[bēngkuì]完全破坏;垮台(多指国家政治、经济、军事等):敌军全线崩溃该国经济濒临崩溃溃退[kuìtuì](军队)被打垮而后退:敌军狼狈溃退溃逃[kuìtáo](军队)被打垮而逃跑:闻风溃逃。
  • soga什么意思中文(soga的解释)
  • 2024-11-22soga的解释soga是日语的“原来如此”、“这样啊”的意思是“そっか”(sokka)或“そうか”(souka)的音译用法:在肯定句中表示人的一种赞同,汉语意思是:“是嘛……”“是这样啊”在疑问句中的意思是:“是吗。
  • 化学品分类(化学品分几大类)
  • 2024-11-22化学品分几大类无机化学包括:元素化学、无机合成化学、无机高分子化学、无机固体化学、配位化学(即络合物化学)、同位素化学、生物无机化学、金属有机化学、金属酶化学等有机化学包括:普通有机化学、有机合成化学、金属和非金属。
  • B端产品 用户注册设计(产品注册登录设计)
  • 2024-11-22产品注册登录设计文章介绍了产品设计中在注册流程和登录流程两个方面需要注意的相关规则,了解了这些基本规则,能帮助你的设计做得更好自从交易性电子商务开始,就一直有登录/注册流程但是,20年后,我们仍然会犯错大多数时候,这。
  • 李钟硕虐心韩剧推荐(外网最浪漫韩剧TOP10)
  • 2024-11-22外网最浪漫韩剧TOP10韩剧一向不缺受众,并且在全世界范围内都拥有众多的粉丝虽然近年来很多韩剧的制片方都开始剑走偏锋,选择拍摄一些伦理剧,但是大众对于浪漫爱情剧的关注度仍旧居高不下日前,国外知名投票平台《Ranker》就发起。
  • 大熊猫团团在台北离世时间(赠台大熊猫团团)
  • 2024-11-22赠台大熊猫团团18岁的大陆赠台大熊猫“团团”疑似罹患恶性脑瘤健康状况持续恶化受到海峡两岸民众关注“团团”是中国大陆赠送给台湾的一对大熊猫中的雄性熊猫2008年12月,“团团”和“圆圆”搭乘专机赴台在台北动物园安家以。
  • 大神已就位活动(嗨一周vol.32)
  • 2024-11-22嗨一周vol.32Vol.32每周五发布朗涛(Landor)操刀的美国建国250周年视觉正式对外公布#朗涛#;#视觉形象#;#周年庆#7月4日,正值美国建国之日,隶属于美国半五百周年纪念委员会(U.S.Semiquin。
  • 赵丽颖沈雨电视剧 网剧谁是凶手里
  • 2024-11-22赵丽颖沈雨电视剧 网剧谁是凶手里#赵丽颖演的沈雨是好人吗#《谁是凶手》开播,赵丽颖演的沈雨上线了,你觉得赵丽颖演的沈雨是好人吗?《谁是凶手》,赵丽颖饰演的沈雨是心理医生却有心理问题,是和十七年前的案子有关系吗?而且看起来非常有反派的。
  • 为什么国考这么多人弃考(国考47万考生弃考)
  • 2024-11-22国考47万考生弃考从报名资格过审的143.7万人,到实际参加笔试的96.5万人,超过47万考生在报名后放弃了笔试机会其实,国考报名后的“弃考”现象近年来一直存在记者梳理过去几年的数据发现,每年都有不少考生选择放弃考试在。
  • 长围巾围法(只需几步轻松搞定)
  • 2024-11-22只需几步轻松搞定首先,将准备好的长围巾平铺,然后再对折其次,将对折好的长围巾放在肩上左右对称摆放,用手握握长围巾两端接着,把长围巾的一端从对折处穿过最后,将长围巾调整到自己脖子觉得舒服的状态,长围巾围法完成了步骤阅读。
  • 台积电5nm 工厂在哪里(台积电1nm工厂敲定)
  • 2024-11-22台积电1nm工厂敲定来源:内容来自经济日报,谢谢台中市长卢秀燕昨(27)日透露,台积电已正式提出中科扩建厂计划,「相关规划案正在处理中」据了解,台积电已锁定中科园区旁台中高尔夫球场用地,设厂面积近100公顷,总投资金额达。