首页 > 其他分享 >手撕Vue-Router-提取路由信息

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

时间:2023-11-20 23:57:00浏览次数:33  
标签:Vue NueRouter VueRouter routes 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,NueRouter,VueRouter,routes,Router,我们,路由
From: https://www.cnblogs.com/BNTang/p/17845229.html

相关文章

  • vue自定义指令按enter键触发事件
    directives:{enter:{bind(el,binding){document.addEventListener('keyup',(event)=>{if(event.keyCode===13){binding.value()}})}}},v-enter="search"......
  • VUE框架实现原理及代码构成结构详解------前端
    VUE框架实现原理及代码构成结构详解------VUE框架<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title&......
  • vue-ui创建项目
    1、命令提示行输入vueui2、他会跳出浏览器界面,之后选择路径创建3、选择条件命令提示框开始创建项目......
  • 如何在设置函数中访问 $vuetify 实例
    在Vue.js的设置函数中访问$vuetify实例可以通过以下步骤来实现:首先,在Vue组件的created钩子函数中访问$vuetify实例。created钩子函数在Vue实例创建之后立即调用。<script>exportdefault{created(){this.$nextTick(()=>{console.log(this.$vuetif......
  • Vue自定义创建项目
    基于VueCli自定义创建项目顺序:安装脚手架vuecreate项目名选择自定义Babel/Router/CSS/LinterVue2.xVueRouterhash模式CSS预处理ESlint:Standard&LintonSave配置文件dedicatedconfigfiles......
  • 路由匹配
    #路由匹配url(r'test',views.test),url(r'testadd',views.testadd)"""url方法第一个参数是正则表达式 只要第一个参数正则表达式能够匹配到内容那么就会立刻停止往下匹配 直接执行对应的视图函数你在输入url的时候会默认加斜杠 django内部帮你做到重定向 一次匹配不行 url后......
  • avue的三种slot 插槽
    avue的三种插槽//菜单插槽<templateslot="menuLeft"><el-buttontype="danger"@click="openDialogAdjustPrice"size="small"icon="el-icon-sort"v-if="permissions['mall:g......
  • 第六章、Vue3高级
    目录二十四、项目实战细节(二)1、组件设置name属性二十四、项目实战细节(二)1、组件设置name属性<scriptsetup>//Vue3.3后支持defineOptions({name:'组件名',inheritAttrs:false})</script>......
  • Vue公共loading升级版(处理并发异步差时响应)
    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤:1.通过全局状态管理定义状态值(vuex、pinia等)。2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画。3.在请求和相应拦截器中变更状态值。第一二步骤处理大同小异,但在第三步中,网上很多博文分享的方法是:在请求......
  • boot3+JDK17+spring-cloud-gateway:4.0.0+spring-cloud:2022.0.0.0+Nacos2.2.1配置动
    项目依赖配置#Nacos帮助文档:https://nacos.io/zh-cn/docs/concepts.html#Nacos认证信息spring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacosspring.cloud.nacos.config.contextPath=/nacos#设置配置中心服务端地址spring.cloud.naco......