前言

在上一篇 [手撕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的更多相关文章

  1. [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 ...

  2. Vue 组件之 Router

    Vue 组件之 Router Vue 开发单页应用的时候,免不了使用Vue组件.在单页应用上如何进行组件切换? 结构如下图所示: 主页面包含Foo组件与Bar组件,在主页面中可以进行Foo与 Bar的 ...

  3. vue路由请求 router

    创建一个Router.js文件 // 路由请求//声明一个常量设置路菜单// import Vue from "vue/types/index";import Vue from ' ...

  4. vue学习之router

    路由文档:https://router.vuejs.org/zh/guide/ 使用vue做spa应用的话,一定会涉及到路由. 安装 安装router插件 npm install vue-router ...

  5. vue项目中router路由配置

    介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    cnpm install vue-rou ...

  6. vue中使用router全局守卫实现页面拦截

    一.背景 在vue项目中使用vue-router做页面跳转时,路由的方式有两种,一种是静态路由,另一种是动态路由.而要实现对路由的控制需要使用vuex和router全局守卫进行判断拦截(安全问题文章最 ...

  7. Vue的路由Router之导航钩子和元数据及匹配

    一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接  h ...

  8. vue全家桶router、vuex、axios

    main.js import Vue from 'vue' import App from './App' import router from './router' import store fro ...

  9. vue & vue router & dynamic router

    vue & vue router & dynamic router https://router.vuejs.org/guide/essentials/dynamic-matching ...

  10. 【面试题】Vue中的$router 和 $route的区别

    Vue中的$router 和 $route的区别 点击视频讲解更加详细 this.$route:当前激活的路由的信息对象.每个对象都是局部的,可以获取当前路由的 path, name, params, ...

随机推荐

  1. 基于C#的消息处理的应用程序 - 开源研究系列文章

    今天讲讲基于C#里的基于消息处理的应用程序的一个例子. 我们知道,Windows操作系统的程序是基于消息处理的.也就是说,程序接收到消息代码定义,然后根据消息代码定义去处理对应的操作.前面有一个博文例 ...

  2. P3874 砍树 题解

    前置 树形 dp,二分. 题意 本质上是一个树上背包,需要选不少于 \(k\) 个物品,每个物品有一个重量 \(w\) 和价值 \(v\),求性价比最大值. 分析 既然是性价比,显然是分数规划. 先介 ...

  3. Spark RDD惰性计算的自主优化

    原创/朱季谦 RDD(弹性分布式数据集)中的数据就如final定义一般,只可读而无法修改,若要对RDD进行转换或操作,那就需要创建一个新的RDD来保存结果.故而就需要用到转换和行动的算子. Spark ...

  4. [译]这几个CSS小技巧,你知道吗?

    前言 在网页设计和前端开发中,CSS属性是非常重要的一部分.掌握常用的CSS属性不仅可以使你的网页看起来更美观,还能提升用户体验,今天小编为大家介绍8个常见的CSS小技巧: 1.修改滚动条样式 下图是 ...

  5. 拓展kmp的应用

    Smiling & Weeping ---- 我与月亮,进行了一次深夜谈话 它与我谈论太阳,而我与它谈论你. 题目链接:P3435 [POI2006] OKR-Periods of Words ...

  6. 破局DevOps|8大北极星指标指引研发效能方向

    放弃那些动辄就上百个的研发度量指标吧,8大北极星指标指引你的研发效能方向,1个北极星指标公式让你清晰了解​公司研发效能现状. 每当研发效能/DevOps业务做规划的时候,有的人就会毫无头绪,不知道如何 ...

  7. Go语句与表达式深度解析:全案例手册

    关注公众号[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资 ...

  8. pyinstall打包相对路径问题

    pyinstall打包相对路径问题 ​ pyinstaller 打包py文件成exe文件,在没有python的机器上运行,执行打包后的程序,经常会出现程序使用的图标无法显示,程序使用的关联文件无法关联 ...

  9. LUSH & LUXURIOUS

    明亮色系Punchy & Bright 明亮.有着强烈对比的颜色更引人注目. 这种大胆的色彩组合要谨慎地利用,所以在明亮色系中的调和色一般用中性色. 其中不同的色彩饱和度,表现出不同的氛围和意 ...

  10. PowerShell 多平台一键生成 Blu-ray Live 分轨

    前言 本人 n 年前的需求,需要自动化的将 Blu-ray Live 转换成 FLAC 格式的文件(自听&发种). ️ 注意:本脚本仅支持输出 flac ! 前提 计算机安装有 PowerSh ...