手撕Vue-Router-添加全局$router属性

前言
经过上一篇文章的介绍,完成了初始化路由相关信息的内容,接下来我们需要将路由信息挂载到Vue实例上,这样我们就可以在Vue实例中使用路由信息了。
简而言之就是给每一个Vue实例添加一个$router属性,这个属性就是我们在上一篇文章中创建的VueRouter实例。
实现思路
我们需要在Vue实例创建之前,将VueRouter实例挂载到Vue实例上,这样我们就可以在Vue实例中使用$router属性了。
在我们实现的 NueRouter 时,我们通过 Vue.use 来安装好我们的路由插件,那么在编写插件中有一个 install 方法,这个方法会在 Vue.use 时被调用,我们可以在这个方法中将 VueRouter 实例挂载到 Vue 实例上。
在 Vue 中有一个 mixin 方法,这个方法会在每个组件创建之前被调用,我们可以在这个方法中将 VueRouter 实例挂载到 Vue 实例上。
重写 beforeCreate 方法,将 VueRouter 实例挂载到 Vue 实例上。在 beforeCreate 方法中,我们可以通过 this.$options.router 获取到我们在 new Vue 时传入的 router 对象,然后将这个对象挂载到 Vue 实例上。如果通过 this.$options.router 获取到了 router 对象,那么就说明这个 Vue 实例是根实例,我们就可以将 router 对象挂载到 Vue 实例上了。
如果获取不到 router 对象,那么就说明这个 Vue 实例不是根实例,我们就需要将父组件的 router 对象挂载到 Vue 实例上。
大致思路就是这样,接下来我们来实现一下。
代码实现
NueRouter.install = (Vue, options) => {
Vue.mixin({
beforeCreate() {
if (this.$options && this.$options.router) {
this.$router = this.$options.router;
this.$route = this.$router.routerInfo;
} else {
this.$router = this.$parent.$router;
this.$route = this.$router.routerInfo;
}
}
})
}
如上的代码就是我们实现的思路,我们通过 this.$options.router 获取到我们在 new Vue 时传入的 router 对象,然后将这个对象挂载到 Vue 实例上。如果获取不到 router 对象,那么就说明这个 Vue 实例不是根实例,我们就需要将父组件的 router 对象挂载到 Vue 实例上。
测试
接下来就是我们平时要进行的测试了,分别在各个组件当中打印一下 $router 和 $route 属性,看看是否挂载成功。
App.vue:
mounted() {
console.log("App", this.$router);
console.log("App", this.$route);
}
Home.vue:
mounted() {
console.log("Home", this.$router);
console.log("Home", this.$route);
}
About.vue:
mounted() {
console.log("About", this.$router);
console.log("About", this.$route);
}
最后我们来看一下效果:

可以看到我们的路由信息已经挂载到 Vue 实例上了。
最后
到这里我们就完成了将路由信息挂载到 Vue 实例上的功能,接下来下一篇文章我会带着大家来实现 实现router-link。

手撕Vue-Router-添加全局$router属性的更多相关文章
- Vue动态添加响应式属性
不能给Vue实例.Vue实例的根数据对象添加属性. 文件 <template> <div id="app"> <h2>{{hello}}:{{a ...
- vue router.push(),router.replace(),router.go()和router.replace后需要返回两次的问题
转载:https://www.cnblogs.com/lwwen/p/7245083.html https://blog.csdn.net/qq_15385627/article/details/83 ...
- vue工程化与路由router
一.介绍 vue.js 是 目前 最火的前端框架,vue.js 兼具 angular.js 和 react.js 的优点,并剔除它们的缺点.并且提供了很多的周边配套工具 如vue-router ...
- vue+el-menu设置了router之后如何跳转到外部链接
<el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="c ...
- vue中$route 和$router的区别
在vue中会出现一种情况 const url=this.$route.query.returnURL; this.$router.push(url); $router和$route的区别傻傻的分 ...
- Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新
一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...
- vue组件上动态添加和删除属性
1.vue组件上动态添加和删除属性 // 添加 this.$set(this.obj, 'propName', val) // 删除 this.$delete(this.obj, 'propName' ...
- vue 中router.go;router.push和router.replace的区别
vue 中router.go:router.push和router.replace的区别:https://blog.csdn.net/div_ma/article/details/79467165 t ...
- vue中,怎么给data对象添加新的属性?(尼玛这面试题居然让我给碰上了。。。。)
Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: <template> <div> <ul> <li v-for="v ...
- vue & this.$route & this.$router
vue & this.\(route & this.\)router const User = { template: '<div>User</div>' } ...
随机推荐
- RobotFrameWork环境搭建及使用
RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...
- 基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章
今次介绍一个应用程序单例唯一运行方案的代码. 我们知道,有些应用程序在操作系统中需要单例唯一运行,因为程序多开的话会对程序运行效果有影响,最基本的例子就是打印机,只能运行一个实例.这里将笔者单例运行的 ...
- 【技术积累】Linux中的命令行【理论篇】【五】
arpd命令 命令介绍 arpd命令是Linux系统中的一个网络工具,用于管理和操作ARP(地址解析协议)缓存.ARP协议用于将IP地址映射到MAC地址,以便在局域网中进行通信. 命令说明 arpd命 ...
- Hugging News #0814: Llama 2 学习资源大汇总 🦙
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- SQL技巧:WITH RECURSIVE递归运算
SQL技巧:WITH RECURSIVE递归运算 1.累加求和运算 -- 计算递归 WITH RECURSIVE t(n) AS ( VALUES (1) UNION ALL SE ...
- CTFshow misc1-10
小提示:需要从图片上提取flag文字,可以通过截图翻译或者微信发送图片,这两个的ai图像识别挺好用的. misc1: 解压打开就能看见flag,提取出来就行 misc2: 记事本打开,看见 ng字符, ...
- 【目标检测】RCNN算法实现
一.前言 RCNN(Regions with CNN features)算法由Ross Girshick在2014年的论文"Rich feature hierarchies for accu ...
- EXE一机一码加密大师1.3.0更新
EXE一机一码打包加密大师可以打包加密保护EXE文件,同时给EXE文件添加上一机一码认证,或者静态密码,不同的电脑打开加密后的文件需要输入不同的激活码才能正常使用,保护文件安全,方便向用户收费. 1. ...
- 2019-A
#include <iostream> #include <vector> using namespace std; class Mystack{ private: int t ...
- 为什么 Rust 备受开发者青睐?
引子 作为一名敏锐的前端开发者,您可能早已对 Rust 有所耳闻,毕竟近几年,使用 Rust 开发的前端构建工具每经发布,其卓越的性能数据总是能带来社区的一阵惊叹. 图片来源:https://swc. ...