手撕Vue-Router-实现router-link

前言
在上一篇 [手撕Vue-Router-添加全局$router属性] 中,实现了将每一个 Vue 实例上挂载一个 $router 属性,这个属性就是我们在上一篇文章中创建的 VueRouter 实例。
开始
本章节,我们将实现一个 router-link 组件,这个组件可以实现点击跳转到指定的路由。
实现思路
我们需要实现一个 router-link 组件,这个组件可以实现点击跳转到指定的路由。
实现 router-link 组件,我们需要注意以下几点:
- 只要外界使用了Vue-Router, 那么我们就必须提供两个自定义的组件给外界使用,一个是
router-link组件,一个是router-view组件。 - 只要外界通过Vue.use注册了Vue-Router, 就代表外界使用了Vue-Router
- 只要外界通过Vue.use注册了Vue-Router, 就会调用插件的install方法
- 所以我们只需要在install方法中注册两个全局组件给外界使用即可
代码实现
- 只要外界使用了Vue-Router, 那么我们就必须提供两个自定义的组件给外界使用,一个是
router-link组件,一个是router-view组件。首先本章节我们只实现router-link组件。 - 只要外界通过Vue.use注册了Vue-Router, 就代表外界使用了Vue-Router
- 只要外界通过Vue.use注册了Vue-Router, 就会调用插件的install方法
- 所以我们只需要在install方法中注册两个全局组件给外界使用即可
代码如下:
NueRouter.install = (Vue, options) => {
...
Vue.component('router-link', {
});
}

好了到此为止,就完成了添加 router-link 组件,只是简简单单的添加了一个组件,还没有实现跳转的功能。
实现跳转功能
通过观察官方的 router-link 组件,我们可以发现,这个组件是一个 <a> 标签,所以我们可以通过 <a> 标签的 href 属性来实现跳转。
这么一来,在根据 Vue 官方文档中介绍的组件注册方式,我们可以在 component 中使用 render 函数来实现渲染 a 标签。
a 标签渲染完毕了但是跳转的地址还没有,还需要在 component 中添加一个 props 属性,这个属性就是我们要跳转的地址。
总结:通过 render 函数渲染 a 标签,通过 props 属性传递跳转地址。
代码如下:
Vue.component('router-link', {
props: {
to: {
type: String,
}
},
render() {
return <a href={this.to}></a>
}
});
写完发现,a 标签渲染了,但是没有内容,我们需要在 a 标签中添加内容,这个内容就是我们在使用 router-link 组件时传入的内容。
我们可以通过 this.$slots.default 来获取到我们在使用 router-link 组件时传入的内容。

代码如下:
return <a href={this.to}>{this.$slots.default}</a>
测试自己写的 router-link 组件,发现可以改变了,发现还有一个问题,就是路由的 mode 为 hash 时,生成的 a 标签的 href 属性是 /#/xxx,如果 mode 为 history 时,生成的 a 标签的 href 属性是 /xxx, 这个问题我们还需要解决。
那么怎么获取到路由的 mode 呢?我们可以通过 this.$router.mode 来获取到路由的 mode。
这里有一个注意点:
render 方法中的 this 并不是当前实例对象, 而是一个代理对象, 如果我们想拿到当前实例对象,那么可以通过
this._self获取
知道了这些内容之后,我们就可以通过 this._self.$router.mode 来获取到路由的 mode 了。根据路由的 mode 来判断生成的 a 标签的 href 属性。
代码如下:
render() {
let path = this.to;
if (this._self.$router.mode === 'hash') {
path = '#' + path;
}
return <a href={path}>{this.$slots.default}</a>
}
测试一下,发现可以了。好了,到此为止,我们就完成了 router-link 组件的实现。
最后
大家好我是 BNTang, 一个热爱分享的技术的开发者,如果大家觉得我的文章对你有帮助的话,可以关注我的公众号 JavaBoyL,我会在公众号中分享一些IT技术和一些个人的见解,谢谢大家的支持。

手撕Vue-Router-实现router-link的更多相关文章
- [React] React Router: Router, Route, and Link
In this lesson we'll take our first look at the most common components available to us in react-rout ...
- Vue 组件之 Router
Vue 组件之 Router Vue 开发单页应用的时候,免不了使用Vue组件.在单页应用上如何进行组件切换? 结构如下图所示: 主页面包含Foo组件与Bar组件,在主页面中可以进行Foo与 Bar的 ...
- vue路由请求 router
创建一个Router.js文件 // 路由请求//声明一个常量设置路菜单// import Vue from "vue/types/index";import Vue from ' ...
- vue学习之router
路由文档:https://router.vuejs.org/zh/guide/ 使用vue做spa应用的话,一定会涉及到路由. 安装 安装router插件 npm install vue-router ...
- vue项目中router路由配置
介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router: cnpm install vue-rou ...
- vue中使用router全局守卫实现页面拦截
一.背景 在vue项目中使用vue-router做页面跳转时,路由的方式有两种,一种是静态路由,另一种是动态路由.而要实现对路由的控制需要使用vuex和router全局守卫进行判断拦截(安全问题文章最 ...
- Vue的路由Router之导航钩子和元数据及匹配
一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接 h ...
- vue全家桶router、vuex、axios
main.js import Vue from 'vue' import App from './App' import router from './router' import store fro ...
- vue & vue router & dynamic router
vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...
- 【面试题】Vue中的$router 和 $route的区别
Vue中的$router 和 $route的区别 点击视频讲解更加详细 this.$route:当前激活的路由的信息对象.每个对象都是局部的,可以获取当前路由的 path, name, params, ...
随机推荐
- Unity三维数学总结
三维向量和三角函数 三维向量 向量是指一个同时具有大小和方向,且满足平行四边形法则的几何对象. 向量的模 po点相对于世界坐标原点的距离: po.magnitude. 标准向量,归一向量,指的是将 ...
- SpringBoot3数据库集成
标签:Jdbc.Druid.Mybatis.Plus: 一.简介 项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富: 通过如下几个组件来实现数 ...
- [ABC213E] Stronger Takahashi
2023-01-17 题目 题目传送门 翻译 难度&重要性(1~10):4 题目来源 AtCoder 题目算法 bfs 解题思路 首先,这道题的问题是从家到鱼市摧毁障碍物的最少次数.我们很容易 ...
- AI绘画关键词Prompt:分享一些质量比较高的StableDiffusion(SD)关键词网站
今天向大家推荐一些SD(StableDiffusion)高质量的 关键词 网站.这些网站的质量可靠,能为大家在创建 AI 绘画时提供有效的参考.以下是六个推荐的网站,优缺点分析. 有几个质量还算是挺高 ...
- 【Python进阶-PyQt5】00PyQt5简介
0.图形用户界面-开发选择 在Python基础的教程中,我们程序的用户交互界面都是运行窗口.这个运行窗口对于我们编程者来说直观明了,但是对于一些相对复杂的程序,用户使用上就会变得十分麻烦.所以,我们要 ...
- 前瞻|Java 21 新特性 String Templates(字符串模版)
在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织.也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种: 使用+拼接 使用StringBuffer和Sp ...
- linux shell根据关键字用sed注释掉整行
一.将带有ab的行注释掉 # cat test # sed -i '/ab/s/^\(.*\)$/#\1/g' test ab是关键字 s是语法替换 ^是行首 $是行尾 \是转义符 数字1带表前述匹配 ...
- Spring Event 观察者模式, 业务解耦神器
观察者模式在实际开发过程中是非常常见的一种设计模式. Spring Event的原理就是观察者模式,只不过有Spring的加持,让我们更加方便的使用这一设计模式. 一.什么是观察者模式 概念: 观察者 ...
- SQL Server用户的设置与授权
SQL Server用户的设置与授权 SSMS 登陆方式有两种,一是直接使用Windows身份验证,二是SQL Server身份验证.使用SQL Server用户设置与授权不仅可以将不同的数据库开放给 ...
- dp_ppi转光纤模块连接200PLC组态王通信案例
DP_PPI转光纤模块连接200PLC组态王光纤通信在冷却塔控制系统案例 现场背景介绍: 西门子200 CPU226PLC通过兴达易控dp转光纤模块在200PLC系统中ppi转光纤实现PCL与组态王2 ...