vue-router实现原理(在Vue3中封装一个)
vue-router实现原理(在Vue3中封装一个)
2024-07-02 09:49:22  作者:阿桃女士  网址: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>

vue-router实现原理(在Vue3中封装一个)(1)

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

我们可以多添加一些常用的功能。例如,我们希望外部链接都在新窗口中打开,这样很简单就能做到了,只要把 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-07-02令人讨厌的苍蝇苍蝇有一个非常独特的地方,那就是它们在生命的每一个过渡阶段都经历一次完全的变态发育从卵到幼虫,再到蛹,再到完全成熟的成虫,每一个阶段都与前面或后面完全不同我们最讨厌的应该是苍蝇的幼虫(俗称蛆),在没有。
  • 各种酱料大全 经典酱料五
  • 2024-07-02各种酱料大全 经典酱料五15[咖喱汁-粤菜]配方:蒜茸2斤,干葱蓉1斤,洋葱蓉1斤虾米3两、大澳虾糕1两印度咖喱粉1斤鲜香茅2两、黄姜粉2两、南姜粉1两,辣椒粉1.5两、红椒粉2两、2斤调和油《制作流程》一,把蒜蓉干葱蓉洋葱。
  • 欢迎各位大神评论(大家怎么看欢迎讨论)
  • 2024-07-02大家怎么看欢迎讨论网上看到一则笑话:街访一个中国人和一个外国人同时计算一个数学题:5*7等于多少?中国人思索片刻后,算出结果等于45,外国人掏出计算器,一顿操作后,算出结果也等于45,于是在中国,别人就会认为你计算能力。
  • 引产痛了很久(引产失去的痛)
  • 2024-07-02引产失去的痛第一篇文章,真的挺不想写这么悲惨的事的,但是我的脑海里最想记录的就是这件事,因为每每想到这件事心里都是痛的,看到身边越来越多的二胎,就更加刺激我总是想到这件事这件事发生在2个月前,2019年10月15。
  • 铁甲战士二手手机(谈价变色成过往)
  • 2024-07-02谈价变色成过往【铁甲网原创】“帮助用户放心经营,幸福生活”是铁甲二手机不断推出新产品的核心动力继5月推出“铁甲二手机排行榜”之后,铁甲二手机把目光聚焦在行业用户普遍关注的“设备价格”上,经过详尽的用户调研、周密的产。
  • 剑灵全武器排行榜(战斗吧剑灵专属武器属性介绍)
  • 2024-07-02战斗吧剑灵专属武器属性介绍今天墨迹给大家带来的是战斗吧剑灵专属武器介绍,装备系统中的最强王者,卡牌专属武器想知道目前的几款专属武器吗?下面就和墨迹一起来看看吧!战斗吧剑灵专属武器专属武器顾名思义就是某卡牌独属的武器,专属武器一。
  • 潮汕十大必备食品(作为潮汕的一种风味食品)
  • 2024-07-02作为潮汕的一种风味食品潮汕人以白粥为主食已经有很长的历史了,在这么长的一段时间中,潮汕人凭借着自己对美食的理解还有些许生活的无奈,创造出了种类丰富的能搭配白粥的小菜,这就是杂咸在众多的杂咸中,有一种显得与众不同,它以其黝黑。
  • 王鹤棣白鹿错撩什么时候上映 5部最新官宣的高颜值电视剧
  • 2024-07-02王鹤棣白鹿错撩什么时候上映 5部最新官宣的高颜值电视剧入坑哪部剧除了吸引人的剧情和特效,男女主的颜值也是必不可少的因素,高颜值的剧集肯定是加分多多俊男美女谈恋爱,谁不喜欢看呢?今天龙仔就为大家推荐才官宣不久的6部高颜值电视剧,看看你的偶像在其中吗?《错撩。
  • 如何美白买什么美白产品(美白产品怎么挑)
  • 2024-07-02美白产品怎么挑美白是爱美人士的永恒诉求近些年,各种美白成分也层出不穷,光光知道几个成分名称已经不能称作优秀面对市场上纷繁的美白成分我们要如何选择?哪些网传消息存在科学性问题?美白拒绝上交智商税,4点干货让你花钱花在。
  • 液压油主要有哪些性质(液压油的主要性质)
  • 2024-07-02液压油的主要性质液压油的作用很大,在实际使用效果中,不但可以有效延长机器寿命、降低维修成本,还可以增加产能、提高工作效率,增加企业竞争优势那么关于液压油,大家都了解多少呢?下面我们就一群来仔细了解一下液压油!粘度和粘。
  • 紫叶茶花如何养(紫叶茶花养护技巧)
  • 2024-07-02紫叶茶花养护技巧盆土对茶花的生长和重要,所以选择土壤时需要慎重,通常以含腐殖质较高和偏微酸性土壤为主,这样就可满足它对土壤的需求茶花怕高温也怕低温,所以温度在18到25度之间最佳,如果温度过高或过低,都会影响它的生长。
  • vlookup该怎么用(如何使用VLOOKUP)
  • 2024-07-02如何使用VLOOKUPVLOOKUP是Excel函数中的一个纵向查找函数,可以用来核对数据,多个表格之间快速导入数据等功能是按列查找,最终返回该列所需查询序列对应的值了解了基本功能后,我们通过一个具体的使用场景,来看看如何。