组件中$router/$route的由来(vue-router源码分析)

news2024/11/28 2:45:35

1.vue-router源码下载

我们可以到github上找到对应版本的vue-router
版本号可以到项目中的node_modules/vue-router/dist/vue-router.js查看嘴上面的许可证说明(package.json只提供了版本的大致范围 ^表示2.2.x 而~表示2.x.x 都为>=的含义)
在github上的vue-router我们要选择Tags中的版本号去下载 而非Branches(这是开发版本 不稳定)

2.源码分析

通过IDE打开刚刚下载好的源码 进入之后 我们选择src/index.js(src下的核心文件) 不断往上溯源 可以找到一个router.js 其中内置了一个install方法(每一个vue插件在使用之前都需要通过use方法进行插件的下载 use方法内部内置了install方法用于下载vue插件)
我们可以通过ctrl+单词的方式查看install定义的源码 从里面我们可以看到两个很熟悉的组件的全局注册 即RouterLink和RouterView 他们可以用于进行路由跳转和路由页面展示位置的确定 并且vue文件的命名一般遵循大驼峰命名 而组件的使用则遵循短横线命名 其中肯定是存在着大驼峰->段横向的变换机制
除了两个组件的注册之外 我们还可以看到我们分析的重点–$router/$route

3.前置知识

① js对象中属性的设置 除了说可以通过内置定义来完成 还可以通过调用相关的api完成 格式为Object.defineProperty(类名.prototype, 属性名, 属性值) 其中类名.prototype获取的是该类名对应的原型对象
② 每一个组件都会继承自Vue原型对象 从而拿到他的变量/方法进行使用

4.$router/$route源码分析

在install.js文件中
在这里插入图片描述
通过上述两个方法完成了对$router/$route的赋值操作
其中 通过defineProperty方法对Vue原型对象中的$router/$route进行赋值操作
我们分别来看一下两个变量的赋值过程:

1.$router的赋值

其实他的赋值操作可以看待成Vue.prototype.$router = return this._routerRoot._router(这种写法不严谨)
在这里插入图片描述

返回值其实是通过上文中这个函数定义的 其中 他会先去判断一下Vue实例中是否传递了options对象($options对应的就是Vue实例中的options对象) 如果有的话 那么就执行里面的逻辑 其中 this指针表示mixin作用域中的this指针(他指向的是他的调用者 即Vue) 首先 他将Vue中的_routerRoot赋值为了本身 接着将Vue中的_router赋值为options对象中的router(挂载到Vue实例中的router对象 即导入的VueRouter实例)
而返回值this.\_routerRoot.\_router中的this._routerRoot表示的是第一个赋值操作的Vue 而this.\_routerRoot.\_router则表示Vue.\_router 即第二个赋值操作中的this.$options.router 即为Vue实例中挂载的router

2.$route的赋值

他的赋值操作可以看作Vue.prototype.$route = return this._routerRoot._route(该写法也不严谨)
我们来分析一下返回值this._routerRoot._route
该返回值其实是动态变化的 他是根据用户的路由选择来决定取值的 他指向的是正处于活跃状态的路由

5.组件中$router/$route的可行性

那么既然我们已经从源码中知道了Vue原型对象中存在$router/$route以及他们的由来
那么他们是如何将这两个变量共享到每一个组件当中的呢
通过前面的前置知识 你就可以知道 每一个组件都会继承自Vue的原型对象 从而拿到他内置的变量/方法去使用 正因为如此 所有的组件才都能够访问$router/$route这两个变量

6.api分析

在我们vue-router源码中 src目录下的router.js文件中 内置了VueRouter的定义类 类中定义了多个常见的api 比如我们所熟悉的push、replace、go等等之类的方法
结合我们之前的分析 Vue原型对象/组件中共享了$router 他指向了正是这个VueRouter对象 所以说我们可以通过$router去调用router.js文件中内置的大量方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个月学会Java 第2天 认识类与对象

Day2 认识类与对象 第一章 初识类 经过一个程序的编写,应该对程序的结构有点好奇了吧,如果你有基础,接下来的肯定非常的易懂,如果你没有基础也没有关系,反复琢磨一下也就懂了😆 我们来重复一下第一个程序 …

Vivado - JTAG to AXI Master (DDR4)

目录 1. 简介 2. JTAG 直接操作 DDR4 2.1 Block Design 2.2 AXI SmartConnect 2.3 DDR4 MIG 2.3.1 时钟和复位 2.3.2 AXI Slave 接口 2.4 XDC 约束 2.5 TCL 代码 2.5.1 写入 DDR4 2.5.2 读取 DDR4 3. HLS IP 操作 DDR4 3.1 Block Design 3.2 HLS IP 3.2.1 HLS 代…

TypeScript面向对象 01

使用class关键字来定义一个类。对象中主要包含了两个部分:属性和方法。 class Person {// 定义实例属性name:string glm;age:number 1234; } const a new Person(); console.log(a.name);在属性前使用static关键字可以定义类属性(静态属性&#xff0…

Sebastian Raschka 最新博客:从头开始用 Llama 2 构建 Llama 3.2

最近已有不少大厂都在秋招宣讲了,也有一些在 Offer 发放阶段。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种: 离散点平滑;螺旋曲线平滑;多项式平滑; 参考链接:参考线平滑 对于平滑方法,一直不太理解平滑、拟合以及滤波三者的作用与区别; 规划的起点&#x…

代码随想录一刷完结

非常偶然的机会让我看到这个算法训练营的存在,虽然我也没有多大的动力,但当时就觉得没什么事情,想着刷刷题,为以后找工作打打基础。 收获 提示:在刷题过程中的收获 第一次使用CSDN记录,每次有别人点赞和收…

【React】事件机制

事件机制 react 基于浏览器的事件机制自身实现了一套事件机制,称为合成事件。比如:onclick -> onClick 获取原生事件:e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上,而是将所有的事件绑定到结构的最外层…

【LeetCode: 134. 加油站 | 贪心算法】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

AI模型部署初认识

AI部署这个词儿大家肯定不陌生,可能有些小伙伴还不是很清楚这个是干嘛的,但总归是耳熟能详了。 近些年来,在深度学习算法已经足够卷卷卷之后,深度学习的另一个偏向于工程的方向–部署工业落地,才开始被谈论的多了起来…

C语言 | Leetcode C语言题解之第456题132模式

题目&#xff1a; 题解&#xff1a; int upper_bound(int* vec, int vecSize, int target) {int low 0, high vecSize - 1;if (vec[high] > target) {return -1;}while (low < high) {int mid (high - low) / 2 low;int num vec[mid];if (num > target) {low m…

IDEA基础开发配置以及和git的联动

1.1方向一&#xff1a;工具介绍 我今天要介绍的就是学习Java大部分情况下都会选择的一款工具-----IDEA&#xff0c;这个和我们熟悉的这个pycharm一样&#xff0c;都是属于这个Jetbrains公司的&#xff0c;虽然我对于这个并不是很了解&#xff0c;但是确实知道一点&#xff0c;…

静止坐标系和旋转坐标系变换的线性化,锁相环线性化通用推导

将笛卡尔坐标系的电压 [ U x , U y ] [U_x, U_y] [Ux​,Uy​] 通过旋转变换(由锁相环角度 θ P L L \theta_{PLL} θPLL​ 控制)转换为 dq 坐标系下的电压 [ U d , U q ] [U_d, U_q] [Ud​,Uq​]。这个公式是非线性的,因为它涉及到正弦和余弦函数。 图片中的推导过程主要…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

使用 Python 进行大规模数据处理

在 Python 中&#xff0c;处理大量数据时&#xff0c;效率是非常重要的。当你有一个包含 100 万个元素的列表&#xff0c;每个元素都是一个字典&#xff0c;并且需要将它们转换为 DataFrame 时&#xff0c;Pandas 是一个很好的工具。Pandas 是 Python 数据处理和分析的强大库&a…

一键生成PPT的AI工具-Kimi!

一键生成PPT的AI工具-Kimi&#xff01; 前言介绍Kimi为什么选择Kimi如何使用Kimi在线编辑PPT下载生成的PPT自己编辑 结语 &#x1f600;大家好&#xff01;我是向阳&#x1f31e;&#xff0c;一个想成为优秀全栈开发工程师的有志青年&#xff01; &#x1f4d4;今天不来讨论前后…

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解&#xff08;重要&#xff09; 引言yolov5&#xff08;v7.0&#xff09;1&#xff0c;yolov5.h(加载对应模型里面的相关参数要更改)2&#xff0c;main主程序&#xff08;1&#xff09;加载网络&#xff08;2&#xff09;检测推理&#xff0…

超酷!任务栏美化 给任务栏添加一个好看的时钟

如何给任务栏美化&#xff1f;今天我们这个主题就是帮大家美化任务栏&#xff0c;估计很多伙伴都用过任务栏美化工具。任务栏美化是非常有个性化的功能&#xff0c;不但可以让你的任务栏变得漂亮&#xff0c;还可以增加一些非常有创意的功能&#xff0c;比如今天小编要给大家带…

文件共享软件推荐,哪些工具最实用?

预计到2025年文档共享市场将增长至近100亿美金。文件共享软件助力跨区域协作&#xff0c;推荐ZohoWorkDrive、GoogleDrive、DropboxBusiness。软件设计直观&#xff0c;上手易&#xff0c;可保障数据安全&#xff0c;选择时需考虑企业规模、需求及预算。 一、什么是文件共享软件…

linux部署NFS和autofs自动挂载

目录 &#xff08;一&#xff09;NFS&#xff1a; 1. 什么是NFS 2. NFS守护进程 3. RPC服务 4. 原理 5. 部署 5.1 安装NFS服务 5.2 配置防火墙 5.3 创建服务端共享目录 5.4 修改服务端配置文件 (1). /etc/exports (2). nfs.conf 5.5 启动nfs并加入自启 5.6 客户端…

陀螺仪LSM6DSV16X与AI集成(14)----上报匿名上位机

陀螺仪LSM6DSV16X与AI集成.14--上报匿名上位机 概述视频教学样品申请源码下载硬件准备上位机通讯陀螺仪工作方式欧拉角数据的转换数据帧填充校验和计算数据发送演示开启INT中断中断读取传感器数据主程序演示 概述 本文介绍了如何将 LSM6DSV16X 传感器的姿态数据通过匿名通信协…