vue-router实现原理(在Vue3中封装一个)
vue-router实现原理(在Vue3中封装一个)
2024-11-22 07:45:04  作者:阿桃女士  网址:https://m.xinb2b.cn/tech/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中间两句写得太惊艳漫漫人生路,感觉特别难熬的时候都有什么?我想,思念与等待会是其中的一个答案如果要为之加一个限制,那就是思念而没有期限,等待却不知归期温庭筠,唐代诗人、词人,花间词主要代表人物之一古时以才思敏捷著称的诗。
  • 长安新能源奔奔e-star 价位(电动小型代步车)
  • 2024-11-23电动小型代步车作为一个年轻一族,选第一辆车的时候,我也有不少想法想要买一辆高颜值,又酷又够用的但我看了看钱包,考虑了我的日常需求最好实用一点开车容易,省钱当然,最好有一个高配置和宽敞的空间经过一段时间的调查,我终于。
  • 索尼dpt-cp1和rc1:从索尼的10.3寸电子纸DPT-CP1
  • 2024-11-23索尼dpt-cp1和rc1:从索尼的10.3寸电子纸DPT-CP1最近,索尼在发布了13.3英寸的电子纸DPT-RP1之后,又在中国发布了10.3应寸小款电子纸产品DPT-CP1,售价4888元起,预购还送价值500元的保护套和笔芯这款产品继承了DPT系列的特点,但。
  • 学龄儿童是什么生肖(小朋友的许多问号)
  • 2024-11-23小朋友的许多问号小朋友的许多问号——属相是什么?那么快来看一看年末新春,春节最爱的时间就是听各种各样的故事,在中国传统故事里,十二生肖一直以来都是两两相对的,代表着六道轮回、这十二种小动物的呈现,其实是我们祖先对我们。
  • 单眼皮肿眼泡毕业妆容(班里所有单眼皮女生都变成双眼皮)
  • 2024-11-23班里所有单眼皮女生都变成双眼皮点击蓝字关注我们和100万亲子家庭共成长在暑假,不少孩子都进行了外貌上的“改造”记者调查发现,一些孩子痴迷追求外貌的完美,不少家长盲目跟风带孩子“动刀”,整容日益低龄化班里“流行”割双眼皮家长直言“为。
  • 传道授业解惑中的道业惑分别怎么理解(道业惑的意思)
  • 2024-11-23道业惑的意思道,指儒家之道;业,泛指古代经、史、诸子之学及古文写作惑,疑难问题出自:唐韩愈《师说》,原文选段:古之学者必有师师者,所以传道受业解惑也人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
  • 企业年金和职业年金哪个划算(企业年金和职业年金)
  • 2024-11-23企业年金和职业年金企业年金和职业年金,有什么区别呢?企业年金和职业年金从概念意义上来讲,其实他们二者之间都是拥有一个相同的概念,就是同属于第2支柱养老保险为什么被称之为第2支柱养老保险呢?因为我们第1支柱养老保险指的是。
  • 溥仪与婉容的历史关系 为了不想和婉容同房
  • 2024-11-23溥仪与婉容的历史关系 为了不想和婉容同房在一九二二年的冬天,溥仪和婉容大婚,这个婚礼办得可谓是相当的隆重,而婉容当时年仅十六岁,却成为了母仪天下的皇后,对于婉容来说,真是开心至极然而事情并不是婉容所想的那样,自从婉容踏进紫禁城,她的厄运就上。
  • 护发精油可以带上高铁吗(护发精油可不可以带上高铁)
  • 2024-11-23护发精油可不可以带上高铁护发精油可以带上高铁客携带品由自己负责看管每人免费携带品的重量和体积是:儿童(含免费儿童)10千克,外交人员35千克,其他旅客20千克每件物品外部尺寸长、宽、高之和不超过160厘米,杆状物品不超过20。
  • 杜蕾斯文案界的扛把子(国外的杜蕾斯文案长啥样)
  • 2024-11-23国外的杜蕾斯文案长啥样被“扫黄办”盯上的感觉如何?作为“老司机”界的翘楚,杜蕾斯的广告文案素来备受关注又充满争议它啥热点都能蹭,啥话题都能拐弯抹角地打擦边球感受一下《权力的游戏》在杜蕾斯手里变成了啥样:“全力地游戏”是什么。