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

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-03产后这个部位最容易疼妈妈怀宝宝是一件很不容易的事情,其实生宝宝更是不易啊,就像是在鬼门关走一遭这句话说的一点儿都不夸张,妈妈们生完宝宝之后身体出现的很多问题都是因为在生产的时候不注意而留下来的后遗症并且大多数宝妈都有反应。
  • 雪天开车挂挡方法(雪天开车开几档)
  • 2024-07-03雪天开车开几档冬季冰雪路面的驾驶,在积雪的上坡路或下坡路,要用发动机的怠速控制车速,尤其是弯道坡路,更是要小心,应提前减速,缓踩刹车,切忌急刹车在坡度15度以上的积雪弯道行车,尽量使车速降至最低,最好使用1挡行驶,。
  • 品香用什么样的香最好(本土入门香特点)
  • 2024-07-03本土入门香特点美丽三部曲通常是指妆容、服饰和香水以前都是前两者关注度高,随着消费升级,香氛市场的增速很快在对冰希黎(BOITOWN)、巴莉奥(BARRIO)、气味图书馆、RE调香室(Reclassified)、普拉。
  • 蟾宫折桂源远流长(中秋佳节蟾宫折桂)
  • 2024-07-03中秋佳节蟾宫折桂@兰心书院写作大佬也不是一开始,就是对的?原创借中秋佳节活动之际,其实初来乍到,也不知道写什么合适,写什么可以?于是也要试错,他想到什么,就去写什么,写完之后,发表出去,再看数据反馈,分析读者偏爱那部。
  • 丰田普拉多高低配区分(丰田普拉多尾标TX)
  • 2024-07-03丰田普拉多尾标TX丰田普拉多在全球范围内都属于“神车”级别,凭借其耐用可靠的质量,易修易换的零部件,以及在改装上的巨大潜力,让这台车成了许多人心中的梦想车型一个喜欢越野的男人,最好的选择之一就是普拉多不止南方的丘陵山路。
  • 曹植的经典诗词(曹植十首经典诗词)
  • 2024-07-03曹植十首经典诗词曹植十首经典诗词,经久不衰,流传千古曹植(192年—232年),字子建,三国曹魏时期著名文学家,曹操之子,曹丕之弟他与曹操、曹丕合称为“三曹”,王士祯曾称把他与李白、苏轼并称“诗仙”一、谦谦君子德,罄。
  • 年审延迟会怎样(1小时可以完成年审)
  • 2024-07-031小时可以完成年审可以的随着汽车的越来越多,大家对于年审的体验也会有些担心,觉得年审会浪费更多的时间,尤其是排队会花去大量的时间过去的确是这样,不过现在随着机动车检测站的不断增多,加上还采用了更多的先进检测设备,可以更。
  • 平行志愿有先后顺序吗(怎么填写平行志愿)
  • 2024-07-03怎么填写平行志愿平行志愿顺序有的先录取第一个,分数不够,录取第二个,以此类推有的高校设有专业极差,需特别注意合理搭配平行志愿,形成有效梯度合理搭配的原则就是一般既不要全部填报分数较高的院校,也不要全部填报分数较低的院。
  • fc和ft的区别
  • 2024-07-03fc和ft的区别ftfc,表示混凝土轴心抗压强度,fct,表示混凝土抗拉强度是指混凝土轴心抗拉强度混凝土轴心抗压强度例子:混凝土轴心抗压强度(fc)是采用150mm×150mm×300mm棱柱体作为标准试件所测得的抗。
  • 吃柿子和苹果有什么功效(不如每天一柿子)
  • 2024-07-03不如每天一柿子处暑已过,但天气仍然燥热,让人心烦意乱,到底该如何应对秋燥?近日由无限极特约的南都健康大讲堂邀请了国医大师、中医体质学创始人王琦教授的师承弟子,来自广东省中医院治未病二沙体质辨识中心的主任韦芳宁讲解中。