Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手写vue-router核心原理

手写vue-router核心原理

原创
作者头像
hellocoder2029
发布于 2022-09-26 08:23:41
发布于 2022-09-26 08:23:41
42600
代码可运行
举报
运行总次数:0
代码可运行

最近也在观察vue3新特性,抽空玩一玩嵌套路由的vue-router,直接上代码

项目目录结构

目录结构
目录结构

代码展示

  • app.vue
代码语言:html
AI代码解释
复制
<template>
  <div id="app">
    <div>
      <router-link to="/">Index</router-link> |
      <router-link to="/person">Person</router-link> |
      <router-link to="/person/info">PersonInfo</router-link>
    </div>
    <!-- 一级路由 -->
    <router-view />
  </div>
</template>

<style>
#app{  display: flex;  flex-direction: column;  align-items: center;}
</style>
  • Index.vue
代码语言:html
AI代码解释
复制
<template>
  <div class="index">
    <h1>this is index page</h1>
  </div>
</template>
  • Person.vue
代码语言:html
AI代码解释
复制
<template>
  <div class="person">
    <h1>this is person page</h1>
     <!-- 二级路由 -->
    <router-view />
  </div>
</template>
  • PersonInfo.vue
代码语言:html
AI代码解释
复制
<template>
  <div class="personInfo">
    <h2>this is personInfo page</h2>
  </div>
</template>
vue全家桶视频讲解:进入学习

js文件

  • main.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')
  • babel.config.js
  • 需要添加babel依赖支持新语法,如可选链
  • npm install --save-dev @babel/core @babel/cli
  • npm install --save-dev @babel/plugin-proposal-optional-chaining
代码语言:text
AI代码解释
复制
module.exports = {
  presets: [    '@babel/preset-env'  ],
  plugins: ['@babel/plugin-proposal-optional-chaining']
}
  • router目录下文件
  • index.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Vue from "vue";
import VueRouter from "./vue-router";
import Index from "../views/Index.vue";
import Person from "../views/Person.vue";
import PersonInfo from "../views/PersonInfo.vue";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Index",
    component: Index
  },
  {
    path: "/person",
    name: "Person",
    component: Person,
    children:[
      {
        path: "/person/info",
        name: "PersonInfo",
        component: PersonInfo
      }
    ]
  }
];

const router = new VueRouter({
  routes
});

export default router;
  • vue-router.js 这里先借助Vue的工具Vue.util.defineReactive实现数据响应式,后续再手撕这个库
代码语言:text
AI代码解释
复制
import routerLink from "./router-link";
import routerView from "./router-view";

let Vue;
class VueRouter {
  constructor(options) {
    this.$options = options

    this.current = window.location.hash.slice(1) || "/"

    // 设置响应式数组数据
    Vue.util.defineReactive(this, "routerArray", [])

    // 监听hash值变化
    window.addEventListener("hashchange", this.hashChange.bind(this))

    this.getRouterArray()
  }

  hashChange() {
    this.current = window.location.hash.slice(1) || "/"
    this.routerArray = []
    this.getRouterArray()
  }

  getRouterArray(routes) {
    routes = routes || this.$options.routes
    for (const route of routes) {
      if (this.current === '/' && route.path === '/') {
        this.routerArray.push(route)
        return
      }

      if (this.current.indexOf(route.path) !== -1 && route.path !== '/') {
        this.routerArray.push(route)
        if (route.children) {
          // 递归子路由
          this.getRouterArray(route.children)
        }
        return
      }
    }
  }
}

VueRouter.install = function(_Vue) {
  Vue = _Vue

  // Vue全局混入,等new Vue中的router实例创建之后挂载到Vue上
  Vue.mixin({
    beforeCreate() {
      if (this.$options.router) {
        Vue.prototype.$router = this.$options.router
      }
    },
  });

  // 注册router-link和router-view全局组件
  Vue.component("router-link", routerLink)
  Vue.component("router-view", routerView)
}

export default VueRouter
  • router-link.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  props: {
    to: {
      type: String,
      required: true
    }
  },
  render(h) {
    return h(
      "a",
      {
        attrs: {
          href: "#" + this.to,
        },
      },
      this.$slots.default
    );
  }
};
  • router-view.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  render(h) {
    // 设置嵌套路由标识
    this.$vnode.data.rv = true

    // 嵌套路由设置深度
    let depth = 0
    let parent = this.$parent
    while (parent) {

      // 上级还有嵌套路由标识rv为true的,深度加一
      if (parent.$vnode?.data?.rv) {
        depth++
      }
      parent = parent.$parent
    }

    // 简单处理
    const route = this.$router.routerArray[depth]
    return h(route?.component);
  }
};

好了,今天就玩到这里了,下次再玩别的哈

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue-router原理分析与实践
Vue Router 是Vue.js官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。 关于Vue Router的使用就不做过多介绍了,大家可以前往Vue Router官网去学习哦~
程序员老鱼
2021/11/06
3800
vue-router原理分析与实践
Vue-Router 简易实现
# 需求分析 作为一个插件存在:实现VueRouter类和install方法 实现两个全局组件:router-view用于显示匹配组件内容,router-link用于跳转 监控url变化:监听hashchange或popstate事件 响应最新url:创建一个响应式的属性current,当它改变时获取对应组件并显示 # 实现 # 作为一个插件存在 // cvue-router.js let Vue; // 1. 实现一个插件:挂载$router class CVueRouter { constructo
Cellinlab
2023/05/17
2100
手写Vue-router核心原理,再也不怕面试官问我Vue-router原理
在 Web 前端单页应用 SPA(Single Page Application)中,路由描述的是 URL 与 UI 之间的映射关系,这种映射是单向的,即 URL 变化引起 UI 更新(无需刷新页面)。
秋风的笔记
2021/09/22
7.6K1
手写Vue-router核心原理,再也不怕面试官问我Vue-router原理
如何吃透 vue-router
vue-router 是vue的插件,是对 vue的前端路由管理器,使用中通常分为hash 与 history模式。
前端小tips
2021/11/27
4500
如何吃透 vue-router
vue-router原理分析与实践
Vue Router 是Vue.js官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。关于Vue Router的使用就不做过多介绍了,大家可以前往Vue Router官网去学习哦~
程序员老鱼
2022/12/02
2490
超燃|从0到1手把手带你实现一款Vue-Router
无论是日常业务还是面试过程中,相信大家对于前端路由这个话题或多或少都有自己的应用和理解。
19组清风
2022/02/28
2.2K0
超燃|从0到1手把手带你实现一款Vue-Router
Vue学习-Vue router
在配置Vue-router时有两种模式,分别为:hash模式(默认)、history模式。
花猪
2022/02/17
4.6K0
Vue学习-Vue router
Vue router原理
vue-router是vue项目的重要组成部分,用于构建单页应用。单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。路由的本质就是建立url和页面之间的映射关系
全栈程序员站长
2022/09/18
5210
跟着来,你也可以手写VueRouter
VueRouter,无疑是每个 Vue 开发者时时刻刻都在使用的东西了,但对于它的源码,你了解多少呢?
isboyjc
2022/03/28
1.6K0
跟着来,你也可以手写VueRouter
vue-router基本使用
 路由,其实就是指向的意思,当我点击页面上的home  按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射。 所以在页面显示中,有两个部分,一个是需要点击的部分,一个是点击之后,显示点击内容的部分。    点击之后,怎么做到正确的对应,比如,我点击home 按钮,页面中怎么才能显示home的内容。这就要在js 文件中配置路由。   路由中有三个基本的概念
大当家
2018/06/28
9820
vue2进阶篇:vue-router之命名路由
命名路由请使用name属性,替换掉path属性的作用,且name直接指定名称即可,而path必须指定3级目录(path=’/demo/test/welcome’)才行。
刘大猫
2024/10/12
1970
vue-router详解——小白速会
一、概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。 vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。 而传统的多页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。 路由中有三个基本的概念 route, routes, router。 1. route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容
柴小智
2018/04/16
1.7K0
vue-router详解——小白速会
Vue Router
  路由的实质是一种对应关系,url 与资源之间的对应关系就是路由。路由分为前端路由和后端路由,后端路由是由服务器完成转发,前端路由是 hash(锚点) 的变化实现的。Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:  ♞ 嵌套的路由/视图表  ♞ 模块化的、基于组件的路由配置  ♞ 路由参数、查询、通配符  ♞ 基于 Vue.js 过渡系统的视图过渡效果  ♞ 细粒度的导航控制  ♞ 带有自动激活的 CSS class 的链接  ♞ HTML5 历史模式或 hash 模式,在 IE9 中自动降级  ♞ 自定义的滚动条行为
Demo_Null
2020/09/28
1.1K0
Vue Router
vue2笔记12 router路由
添加replace属性,导航时使用新地址替换当前导航历史记录,而不是压入历史记录栈
路过君
2022/04/13
6770
vue2进阶篇:vue-router之路由的params参数
跳转路由并携带params参数,to的对象写法中,不能配置path参数,不然页面会没效果(就是点击完数据都没了),正确写法只能配置name属性,不能配置path属性
刘大猫
2024/10/12
2640
vue2进阶篇:vue-router之router-link的replace属性
<font color='red'>完整写法</font> =》 :replace=’true’
刘大猫
2024/10/12
1460
vue-router 源码阅读 - 文件结构与注册机制
前端路由是我们前端开发日常开发中经常碰到的概念,在下在日常使用中知其然也好奇着所以然,因此对 vue-router 的源码进行了一些阅读,也汲取了社区的一些文章优秀的思想,于本文记录总结作为自己思考的输出,本人水平有限,欢迎留言讨论~
前端下午茶
2019/06/27
9150
vue-router 源码阅读 - 文件结构与注册机制
vue2进阶篇:vue-router之缓存路由组件
<font color='red'>\<keep-alive></font>用于路由缓存,其中inclue用于指定只缓存指定名称的组件,<font color='red'>其中News指代一定是“组件名”,指代一定是“组件名”,指代一定是“组件名”,重要的事情说3遍</font>。
刘大猫
2024/10/10
2600
vue-router 的基本使用
vue-router 官方文档: https://router.vuejs.org/zh
很酷的站长
2022/12/28
7010
vue-router 的基本使用
【vue】12.0 vue路由:vue-router
Vue Router官网: https://router.vuejs.org/zh/installation.html
conanma
2021/11/03
7730
相关推荐
vue-router原理分析与实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验