终于把 vue-router 运行原理讲明白了(一)!!!

news2024/11/25 11:00:45

一、vue-router 用法

1.1 首先我们需要在我们的项目中,下载vue-router,我在项目中使用的是3.x版本
1.2 在项目中引入,并实例化路由实例,贴代码如下
1.3 下面代码有两个重点部分,等在第三部分具体分析
(1)Vue.use(VueRouter)
(2)new VueRouter

//router.js
import Vue from "vue";
import VueRouter from "vue-router"
Vue.use(VueRouter) //调用vue.use 全局api ,调用VueRouter本身的install 方法,执行里面逻辑
const routes = [
    {
        path:"/rule",
        name:"rule",
        component:()=> import("../views/index/rule")
    },
    {
        path:"/myCoupon",
        name:"myCoupon",
        component:()=> import("../views/coupon/couponList")
    }
]
const router = new VueRouter({ //实例化路由实例
    routes
})
export default router

1.4 在实例化Vue 时,将路由实例作为构造参数,传入,代码如下

import router from './router';
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

1.5 常用方法
(1) push 在现有路由记录新增一个记录,并跳转到指定页面,这个可以返回上一个页面
(2) replace 将当前路由记录替换成目标记录,无法返回上一个页面
更多用法,在这里不做多介绍,本文主要剖析原理,具体方法请到 vue-router 官方文档

method(){
	navigateTo(url){
		this.$router.push(`/${url}`)
	},
	redirectTo(url){
		this.$router.replace(`/${url}`)
	}
}

二、下载vue-router源码

2.1 到github 下载vue-router 源码 地址
代码结构如下图,src 目录即项目源码目录,examples是项目demo示例,可以进行调试用
在这里插入图片描述

2.2 执行 npm install ,下载依赖
2.3 执行 npm run dev 启动项目
2.3 成功启动后,根据输出,一般是 localhost:8080/ 便可以访问项目,如下图所示
在这里插入图片描述

三、深入vue-router运行原理

3.1 在源码的examples 目录中 ,找到basic 文件,接下来将会用此实例,带大家剖析
在这里插入图片描述
app的代码如下:重点如下
(1)Vue.use(VueRouter)
(2)new VueRouter
Vue.use 是Vue的全局api,提供给外部的插件使用该api,这个方法很简单,就是执行了VueRouterinstall 方法

import Vue from 'vue'
import VueRouter from 'vue-router'

// 1. Use plugin.
// This installs <router-view> and <router-link>,
// and injects $router and $route to all router-enabled child components
console.log("执行 Vue.use 方法")
Vue.use(VueRouter)

// 2. Define route components
const Home = { template: '<div>home</div>' }
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const Unicode = { template: '<div>unicode</div>' }
const Query = { template: '<div>query: "{{ $route.params.q }}"</div>' }

// 3. Create the router
const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: [
    { path: '/', component: Home },
    { path: '/foo', component: Foo },
    { path: '/bar', component: Bar },
    { path: encodeURI('/é'), component: Unicode },
    { path: '/query/:q', component: Query }
  ]
})
console.log("实例化vueRoute 实例",router)
// 4. Create and mount root instance.
// Make sure to inject the router.
// Route components will be rendered inside <router-view>.
const vueInstance = new Vue({
  router,
  data: () => ({ n: 0 }),
  mounted(){
    const increment = () => this.n++
    setTimeout(()=>{
      this.$router.push('/foo',increment)
    },3000)

    setTimeout(()=>{
      // this.$router.back()
    },4000)
  },
  methods: {
    navigateAndIncrement () {
      const increment = () => this.n++
      if (this.$route.path === '/') {
        this.$router.push('/foo', increment)
      } else {
        this.$router.push('/', increment)
      }
    }
  }
}).$mount('#app')
console.log("实例化Vue",vueInstance)

3.2 下面分析一下VueRouter 的install方法做了什么,首选我们找到 src 目录下的install.js,代码如下

export function install (Vue) {
  if (install.installed && _Vue === Vue) return
  install.installed = true
  console.log("执行router的install")
  _Vue = Vue

  const isDef = v => v !== undefined
  console.log("执行VueMixin")
  Vue.mixin({
    beforeCreate () {
      console.log(`开始执行注入Mixin的create方法,这样大家能够访问 route`,this._uid)
      if (isDef(this.$options.router)) {
        console.log("根组件进入这里逻辑,准备执行 route 的init方法")
        this._routerRoot = this
        this._router = this.$options.router
        this._router.init(this) 
        //在根组件
        debugger
		//监听_router 属性变化,一旦这个值发生变化,变化触发对应的视图更新
        Vue.util.defineReactive(this, '_route', this._router.history.current)
      } else {
        console.log("子组件进入这里逻辑,初始化routerRoot")
        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
      }
    },
  })

  Object.defineProperty(Vue.prototype, '$router', {
  
    get () { return this._routerRoot._router }
  })

  Object.defineProperty(Vue.prototype, '$route', {
    get () { return this._routerRoot._route }
  }) 
}

3.3 我们可以看到,
(1)使用了Object.defineProperty 在Vue.prototype 原型上,挂载 r o u t e r 和 router和 routerrouter 属性, 这个很重要,这个就是我们为什么能在任何一个挂载到根实例的组件中,使用 这两个属性,进行路由的跳转的原因
(2)在根组件的beforeCreate() 钩子函数中,使用了Vue 的 defineReactive 方法侦测 _route 属性变化,一旦改值发生变化,Vue 变化通知对应的依赖进行视图更新,这个也是为什么我们路由改变时候,页面会发生变化的根本原因。

四、本文最后(后续持续更新)

4.1 好了小伙伴们,本人介绍了能在全局使用路由的原因和视图更新机制,后续文章会介绍,_route是如何改变的

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

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

相关文章

FAMI-Pose训练

之前写过FAMI-Pose的论文解析&#xff0c;最近跑了一下官方代码&#xff0c;链接是&#xff1a;FAMI-Pose&#xff0c;但有很多问题&#xff0c;感觉是不是作者上传错了。这篇博客讲一下FAMI-Pose的训练。 运行 首先&#xff0c;安装环境&#xff0c;这个根据官方requirement…

NTT入门 开拓者的卓识

link 大意&#xff1a; 给定一个长度为n的数组a&#xff0c;求[1,n]的k阶子段和 我们定义k阶子段和如下&#xff1a; 思路&#xff1a; 这个k阶字段和&#xff0c;就是在k-1阶的基础上&#xff0c;再讲所有k-1阶的子段和都相加得到k阶子段和 k是很大的&#xff0c;所以我…

【C++学习】unordered_map和unordered_set的使用和封装

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; unordered_map和unordered_set &#x1f9e2;unordered_map/set&#x1f52e;性能比较&#x1f52e;成…

Python采集二手车数据信息实现数据可视化展示

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用&#xff1a; Python 3.8 Pycharm 专业版是付费的 <文章下方名片可获取魔法永久用~> 社区版是免费的 模块使用&#xff1a; 第三方模块 需要安装的 requests >>> pip install requests p…

分享5款让生活和工作变得更加高效的软件

随着科技的发展,我们的生活和工作变得越来越数字化和自动化。许多实用软件应运而生,它们不仅简化了我们的生活,也使工作变得更加高效。这里我们来介绍5款非常实用的软件工具。 1.安全擦除工具——Secure Eraser Secure Eraser是一款可以安全删除数据的工具&#xff0c;它使用…

基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性

本文将基于 铜锁&#xff08;tongsuo&#xff09;开源基础密码库实现前端对用户登录密码的加密&#xff0c;从而实现前端隐私数据的保密性。 首先&#xff0c;铜锁密码库是一个提供现代密码学算法和安全通信协议的开源基础密码库&#xff0c;在中国商用密码算法&#xff0c;例…

京东T7架构师用470页就把微服务架构原理与开发实战文档讲完了

前言 最近几年软件开发方法层出不穷&#xff0c;微服务作为一种主流的架构模式一直热度不减。 为了帮助广大程序员们更好更快地理解微服务的概念&#xff0c;学习微服务在项目中的实践&#xff0c;本文全面阐述了微服务架构模式的特点、架构思路、设计理念、技术框架及具体的…

根据cadence设计图学习硬件知识day07 了解一些芯片

1.LC0502N &#xff08;ESD静电保护元件&#xff09; 1.1 LC0502N 介绍 应用 ● USB 2.0电源和数据线 ● 机顶盒和数字电视 ● 数字视频接口&#xff08;DVI&#xff09; ● 笔记型电脑 ● SIM端口 ● 10/100以太网 1.2 LC0502N 引脚介绍 &#xff08;无语&#xff0…

1。C语言基础知识回顾

学习嵌入式的C基础知识&#xff0c;主要包括几个核心知识点&#xff1a;三大语法结构、常用的数据类型、函数、结构体、指针、文件操作。 一、顺序结构 程序自上而下依次执行、没有分支、代码简单。 常见顺序结构有&#xff1a;四则运算&#xff1a;&#xff0c;-&#xff0…

通达信顾比倒数线指标公式,信号不漂移

顾比倒数线是由技术派大师戴若顾比发明的&#xff0c;该指标利用三个重要的价格来判断入场或离场时机&#xff0c;可用于盘后制定下一个交易日的操作计划。此外&#xff0c;顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前&#xff0c;需要先了解顾比倒…

vue3之vite创建h5项目之2 (sass公共样式、声明组件、路由配置和layout组件 )

目录 vue3之vite创建h5项目之2 &#xff08; &#xff09;1&#xff1a;安装sass1-1 使用sass引入公共样式11-1-1 main.ts 引入公共样式方式 1-2 vite.config.ts 引入公共样式方式21-3样式文件1-3-1 src / style / index.scss ( 适配iphonex等还有引入其他公共的样式 )1-3-2 sr…

CRM部署Always on 后 CRM报无法更新数据库,数据库只读,且读写分离不正常

CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读&#xff0c;读写分离不正常 问题描述背景信息问题原因解决方案 问题描述 CRM部署Always on 后 CRM报无法更新数据库&#xff0c;数据库只读 读写分离不正常,出现错乱链接。 背景信息 1.2个节点配置SQL serve…

从安全气囊到标配EDR,TOP10控制器供应商领跑市场

2022年1月1日开始&#xff0c;国内新生产新乘用车都必须标配EDR&#xff08;Event Data Recorder&#xff09;&#xff0c;也就是俗称的汽车“黑匣子”&#xff0c;也称为汽车事件数据记录系统&#xff0c;记录的数据可重现事故过程&#xff0c;用于汽车事故分析。 在此之前&am…

【常用算法】进制转换

目录 1. 二进制数、八进制数、十六进制数转换为十进制数 2. 十进制数转换为二进制数、八进制数、十六进制数 3. 二进制数和十六进制数的相互转换 4. 使用电脑计算器进行进制转换 1. 二进制数、八进制数、十六进制数转换为十进制数 十进制数的每一位都是10的指数幂。如&…

基于趋动云的 Stable Diffusion Webui 环境搭建

Stable Diffusion Webui 环境搭建&#xff0c;首先新建一个项目&#xff1a; 然后&#xff0c;选择镜像。注意点公开的&#xff0c;已近做好的这个镜像&#xff0c;superx创建&#xff0c;集成了miniconda3的镜像。 然后选择添加数据源&#xff0c;一样&#xff0c;还是点公开&…

Epinio:Kubernetes 的应用程序开发引擎

王海龙&#xff0c;Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层操作系统 Linux&#x…

A100单机多卡大模型训练踩坑记录(CUDA环境、多GPU卡住且显存100%)

踩坑1&#xff1a;服务器只装了 CUDA Driver 没装 CUDA Toolkit 系统&#xff1a;Ubuntu-18.04 用 deepspeed 跑百亿模型训练时&#xff0c;报关于 CUDA_HOME 的错误。 AssertionError: CUDA_HOME does not exist, unable to compile CUDA op(s)执行 echo $CUDA_HOME 和 nvcc…

HTB-Nineveh

HTB-Nineveh 信息收集80端口443端口80端口-新443端口-新 立足www-data -> amroisamrois -> root其他有意思的地方knock knock - Whos there?socket type 信息收集 80端口 目录扫描 /info.php目录 443端口 目录扫描 这完全没头绪&#xff0c;估计是信息收集漏了东西…

NCR被攻击后服务中断!原是BlackCat勒索软件作祟

近日&#xff0c;在遭到BlackCat勒索软件攻击后&#xff0c;NCR 的 Aloha 销售点平台出现中断。 NCR公司是全球关系管理技术解决方案领导供应商&#xff0c;为全球零售、金融、传讯、制造、旅游、交通及保安等客户提供服务。凭著累积多年的业界知识、专业顾问经验、专业增值应用…

手把手教你本地CPU环境部署清华大模型ChatGLM-6B,利用量化模型,本地即可开始智能聊天,达到ChatGPT的80%

大家好&#xff0c;我是微学AI&#xff0c;今天教你们本地CPU环境部署清华大ChatGLM-6B模型&#xff0c;利用量化模型&#xff0c;每个人都能跑动大模型。ChatGLM-6B是一款出色的中英双语对话模型&#xff0c;拥有超过62亿个参数&#xff0c;可高效地处理日常对话场景。与GLM-1…