手撕Vue-Router-提取路由信息

前言
好了经过上一篇的学习,我们已经知道了如何监听 Hash 的变化,如何监听路径的一个变化,本篇我们就可以来实现我们自己的 VueRouter 了, 那么怎么实现呢,在实现之前我们先来回顾一下官方的 VueRouter 是怎么使用的。
VueRouter 的使用
首先需要去下载官方的 VueRouter,如果是通过 npm 的方式就可以通过 npm install vue-router 来进行安装,如果是通过 script 的方式引入的话,可以通过 cdn 的方式来进行引入,然后我们就可以在 Vue 的实例中进行使用了。
如上这是第一步,第二呢就是注册我们的 VueRouter,通过 Vue.use(VueRouter) 来进行注册,然后我们就可以在 Vue 的实例中进行使用了。
通过观察 VueRouter 是通过,Vue.use 进行注册的,所以 VueRouter 是一个插件,所以说编写 VueRouter 就是在编写一个插件。
好,那么我现在就新建一个 Nue-Router.js 文件,然后我们就可以开始编写我们的 VueRouter 了。
紧接着我在文件内部搭建了一个插件的基本结构,代码如下:
class NueRouter {
}
NueRouter.install = (Vue, options) => {
}
export default NueRouter;
搭建好了之后我们来看看怎么使用的,我通过观察官方的 VueRouter 的使用发现,是通过 new VueRouter({}) 的方式来进行使用的,在创建的时候给他传递了参数,所以说我们需要在 NueRouter 的构造函数中接收这个参数, 那么外界传递了什么参数给我们呢,通过观察官方的示例,可以得知传递了一个 mode 的参数,这个参数是用来指定路由的模式的,是 hash 还是 history,所以说我们需要在 NueRouter 的构造函数中接收这个参数,还传递了一个用户配置了路由的 routes 参数,所以说我们也需要在 NueRouter 的构造函数中接收这个参数,那么我们就可以在 NueRouter 的构造函数中接收这两个参数了,代码如下:
class NueRouter {
    constructor(options) {
        this.mode = options.mode || 'hash';
        this.routes = options.routes || [];
    }
}
保存好了这些信息之后还没完,为了后续我们方便去处理 routes 的信息,我需要改造一下,改造成什么样子呢,就是将之前的路由地址改造为 key, 组件是我们的一个 value,那么这样子的话我们将来就可以通过 key(路由地址) 去获取到我们的组件了,然后直接将我们获取到的组件渲染到 router-view 中就可以了。
所以最终我要改造的数据结构如下:
{
    '/home': Home,
    '/about': About
}
那么我们怎么去改造呢,我们可以通过遍历 routes,然后将每一项的 path 作为 key,component 作为 value,组装一个全新的对象将全新的对象数组进行存储到 NueRouter 的 routes 中,代码如下:
createRoutesMap() {
    return this.routes.reduce((map, route) => {
        map[route.path] = route.component;
        return map;
    }, {});
}

测试
好了,我们现在已经将我们的路由信息提取出来了,那么我们就可以进行测试了,我们将官方的 VueRouter 替换成我们自己的 NueRouter,然后运行项目,打开控制台,我们可以看到我们的路由信息已经被提取出来了。

最后

手撕Vue-Router-提取路由信息的更多相关文章
- Vue router 一个路由对应多个视图
		
使用命名路由 https://jsfiddle.net/posva/6du90epg/ <script src="https://unpkg.com/vue/dist/vue.js&q ...
 - Vue 中的Vue Router一级路由,二级路由,三级路由以及跳转
		
今天编写了一下Vue中的路由 先用命令行新建一个空的项目,并且我知道要用路由,就下载了路由的相关依赖 vue init webpack demo5 完毕之后进入所在的项目 cd demo5 之后用vs ...
 - Vue router前端路由配置以及实现tab切换
		
vue router 安装:npm install vue-router或cnpm install vue-router或yarn add vue-router. 安装完成之后会在package.js ...
 - Vue router 全局路由守卫
		
记录一下全局路由守卫的使用: 方法一:定义一个数组用于检测与管理需要登录的页面,全局路由守卫配合本地存储判断是否跳转 import Vue from 'vue' import Router from ...
 - vue router动态路由
		
<div id="#app"> <router-link to="/user/header">路由1</router-link&g ...
 - vue  router引入路由与路由配置容易犯错的地方与常见的报错与处理报错
		
首先npm安装vue-router插件,就不说了其次: 先看下我本地的目录结构吧 第一步:在src目录下新建一个专门存放router的index.js文件里面的内容为: import Vue from ...
 - [Vue 牛刀小试]:第十三章 - Vue Router 基础使用再探(命名路由、命名视图、路由传参)
		
一.前言 在上一章的学习中,我们简单介绍了前端路由的概念,以及如何在 Vue 中通过使用 Vue Router 来实现我们的前端路由.但是在实际使用中,我们经常会遇到路由传参.或者一个页面是由多个组件 ...
 - 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI
		
一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...
 - [Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制
		
一.前言 前端路由是什么?如果你之前从事的是后端的工作,或者虽然有接触前端,但是并没有使用到单页面应用的话,这个概念对你来说还是会很陌生的.那么,为什么会在单页面应用中存在这么一个概念,以及,前端路由 ...
 - vue教程(五)--路由router介绍
		
一.html页面中如何使用 1.引入 vue-router.js 2.安装插件 Vue.use(VueRouter) 3.创建路由对象 var router = new VueRouter({ // ...
 
随机推荐
- CSS: 绝对定位fixed
			
属性介绍 元素会被移出正常文档流,并不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置.元素的位置在屏幕滚动时不会改变.打印时,元素会出现在的每页的固定位置.fi ...
 - python移动文件
			
#移动文件(目录) shutil.move("oldpos","newpos") shutil.move("D:/知乎日报/latest/一张优惠券, ...
 - ABC274 题解
			
A 题目:给定 \(A,B\) 输出 \({B}\over{A}\) 保留 \(3\) 位小数. 简答题,和A+B problem 一样,除一除,保留一下小数. B 题目:给定一个 \(n\) 行 \ ...
 - 代码随想录算法训练营第八天| LeetCode  344.反转字符串  541. 反转字符串II   151.翻转字符串里的单词
			
344.反转字符串 卡哥建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https: ...
 - Blazor前后端框架Known-V1.2.10
			
V1.2.10 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
 - C++多线程中互斥量的使用
			
多线程中互斥信号量(Mutex)的使用 1.0 互斥量的基本概念 1.1 Example \(\quad\)首先我们要明白,为什么会有互斥信号量的出现,在多线程编程中,不同的线程之间往往要对同一个数据 ...
 - Vue3 路由优化,使页面初次渲染效率翻倍
			
3996 条路由? addRoute函数用了大约1s才执行完毕.通过观察,发现居然有3996条路由记录. 可是项目并没有这么多的页面啊~ 重复路由 let routes: Array<Route ...
 - API接口的技术的概念
			
当今互联网技术的发展越来越快,越来越多的网站和应用程序需要获取外部数据来提供更好的服务和用户体验,这就需要使用API接口.本文将会对API接口的概念.类型以及如何调用API接口进行简要介绍. 一.什么 ...
 - python 获取本周 ,上周,本月,上月,本季,上季,今年, 去年的第一天和最后一天
			
import datetime from datetime import timedelta now = datetime.datetime.now()# 获取当前月的天数 month = 2days ...
 - Hugging News #0904:🤗 登陆 AWS Marketplace
			
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...