位置: IT常识 - 正文

关于Vue-Router 底层运行逻辑浅析(vue$router)

编辑:rootadmin
1.Vue-Router 只要是使用Vue 开发程序 就不可避免的会使用到 Vue-Router ( 路由),作为Vue生态的一部分 Vue-Router 不同于传统的开发模式,每个url都会重新加载页面,而是单页面(Single Page Application)模式是根据url加载不同的组件,这 ... 1.Vue-Router

推荐整理分享关于Vue-Router 底层运行逻辑浅析(vue$router),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue router底层原理,vue-router baseurl,vue中routes,vue router addroutes,vue-routet,vue-routet,vue router底层原理,vue $route,内容如对您有帮助,希望把文章链接给更多的朋友!

只要是使用Vue 开发程序 就不可避免的会使用到 Vue-Router ( 路由),作为Vue生态的一部分 Vue-Router 不同于传统的开发模式,每个url都会重新加载页面,而是单页面(Single Page Application)模式是根据url加载不同的组件,这样做可以

1.监听Url的变化,并在变化前后执行相应的代码逻辑2.不同的Url 可以对应不同的组件3.提供了更多方式改变Url的API (Url的改变不能导致页面的刷新)2.Vue-Router 的使用方式1.Vue是使用.use( plugins )方法将插件注入到Vue中。use方法会检测注入插件VueRouter内的install方法,如果有,则执行install方法。

注意:如果是在浏览器环境,在index.js内会自动调用.use方法。如果是基于node环境,需要手动调用。所以在浏览器环境下可以省略不写Vue.use(VueRouter) 注册方法。

2.Install解析 (对应目录结构的install.js)关于Vue-Router 底层运行逻辑浅析(vue$router)

该方法内主要做了以下三件事:

1、对Vue实例混入beforeCreate钩子操作(在Vue的生命周期阶段会被调用)2、通过Vue.prototype定义router、router、route 属性(方便所有组件可以获取这两个属性)3、Vue上注册router-link和router-view两个组件点击查看代码export function install (Vue) { if (install.installed && _Vue === Vue) return install.installed = true _Vue = Vue const isDef = v => v !== undefined const registerInstance = (vm, callVal) => { let i = vm.$options._parentVnode if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) { i(vm, callVal) } } Vue.mixin({ //对Vue实例混入beforeCreate钩子操作 beforeCreate () { if (isDef(this.$options.router)) { this._routerRoot = this this._router = this.$options.router this._router.init(this) Vue.util.defineReactive(this, '_route', this._router.history.current) } else { this._routerRoot = (this.$parent && this.$parent._routerRoot) || this } registerInstance(this, this) }, destroyed () { registerInstance(this) } }) //通过Vue.prototype定义$router、$route 属性(方便所有组件可以获取这两个属性) Object.defineProperty(Vue.prototype, '$router', { get () { return this._routerRoot._router } }) Object.defineProperty(Vue.prototype, '$route', { get () { return this._routerRoot._route } }) //Vue上注册router-link和router-view两个组件 Vue.component('RouterView', View) Vue.component('RouterLink', Link) const strats = Vue.config.optionMergeStrategies // use the same hook merging strategy for route hooks strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created}3.生成router实例

生成实例过程中,主要做了以下两件事

1、根据配置数组(传入的routes)生成路由配置记录表。2、根据不同模式生成监控路由变化的History对象

注:History类由HTML5History、HashHistory、AbstractHistory三类继承history/base.js实现了基本history的操作history/hash.js,history/html5.js和history/abstract.js继承了base,只是根据不同的模式封装了一些基本操作

const router = new VueRouter({ routes })

4.生成Vue实例点击查看代码 const app = new Vue({ router, template: ` <div id="app"> <h1>Basic</h1> <ul> <li><router-link to="/">/</router-link></li> <li><router-link to="/user">用户</router-link></li> <li><router-link to="/role">角色</router-link></li> <router-link tag="li" to="/user">/用户</router-link> </ul> <router-view class="view"></router-view> </div> ` }).$mount('#app')代码执行到这,会进入Vue的生命周期,在这一步Vue-Router对Vue混入了beforeCreate钩子会在此会执行点击查看代码Vue.mixin({ beforeCreate () { //验证vue是否有router对象了,如果有,就不再初始化了 if (isDef(this.$options.router)) { //没有router对象 //将_routerRoot指向根组件 this._routerRoot = this //将router对象挂载到根组件元素_router上 this._router = this.$options.router //初始化,建立路由监控 this._router.init(this) //劫持数据_route,一旦_route数据发生变化后,通知router-view执行render方法 Vue.util.defineReactive(this, '_route', this._router.history.current) } else { //如果有router对象,去寻找根组件,将_routerRoot执行根组件(解决嵌套关系时候_routerRoot指向不一致问题) this._routerRoot = (this.$parent && this.$parent._routerRoot) || this } registerInstance(this, this) }, destroyed () { registerInstance(this) } })执行完这一步后,代码完成初始化,加载页面完成,界面将默认显示主页3.路由更新方式1.主动触发

router-link绑定了click方法,触发history.push或者history.replace,从而触发history.transitionTo。transitionTo用于处理路由转换,其中包含了updateRoute用于更新route。在beforeCreate中有劫持route的方法,当_route变化后,触发router-view的变化。

2.地址变化(如:在浏览器地址栏直接输入地址)

HashHistory和HTML5History会分别监控hashchange和popstate来对路由变化作对用的处理 。HashHistory和HTML5History捕获到变化后会对应执行push或replace方法,从而调用transitionTo,剩下的就和上面主动触发一样

4.总结1、安装插件混入beforeCreate生命周期处理,初始化_routerRoot,_router,_route等数据全局设置vue静态访问router和router和route,方便后期访问完成了router-link和 router-view 两个组件的注册,router-link用于触发路由的变化,router-view作 为功能组件,用于触发对应路由视图的变化2、根据路由配置生成router实例根据配置数组生成路由配置记录表生成监控路由变化的hsitory对象3、将router实例传入根vue实例根据beforeCreate混入,为根vue对象设置了劫持字段_route,用户触发router-view的变化调用init()函数,完成首次路由的渲染,首次渲染的调用路径是 调用history.transitionTo方法,根据router的match函数,生成一个新的route对象接着通过confirmTransition对比一下新生成的route和当前的route对象是否改变,改变的话触发updateRoute,更新hsitory.current属性,触发根组件的route的变化,从而导致组件的调用render函数,更新router-view,另外一种更新路由的方式是主动触发router-link绑定了click方法,触发history.push或者history.replace,从而触发history.transitionTo同时会监控hashchange和popstate来对路由变化作对用的处理友情连接旭逸的博客
本文链接地址:https://www.jiuchutong.com/zhishi/311686.html 转载请保留说明!

上一篇:Python代码用在这些地方,其实1行就够了!(python代码用什么运行)

下一篇:python中INF值的介绍(python输出inf)

  • 国家卫健委医政司司长焦雅辉:新冠确实不是大号感冒

    国家卫健委医政司司长焦雅辉:新冠确实不是大号感冒

  • 让产品变流行的11种方法(让产品变流行的软件)

    让产品变流行的11种方法(让产品变流行的软件)

  • realme gt neo2摄像头参数是怎样的(realme gt neo前摄)

    realme gt neo2摄像头参数是怎样的(realme gt neo前摄)

  • 荣耀X30Max是双扬声器吗(荣耀x30max x10max)

    荣耀X30Max是双扬声器吗(荣耀x30max x10max)

  •  华为荣耀20青春版是双卡双待吗(华为荣耀20青春版什么时候上市的)

    华为荣耀20青春版是双卡双待吗(华为荣耀20青春版什么时候上市的)

  • 星标朋友动态会有提示吗(设为星标朋友后朋友圈有变化吗)

    星标朋友动态会有提示吗(设为星标朋友后朋友圈有变化吗)

  • ipad怎么贴膜钢化膜(ipad怎么贴膜钢化膜没有气泡)

    ipad怎么贴膜钢化膜(ipad怎么贴膜钢化膜没有气泡)

  • vivos5呼吸灯在哪里设置(vivos6手机5g呼吸灯在哪里)

    vivos5呼吸灯在哪里设置(vivos6手机5g呼吸灯在哪里)

  • 拼多多降权会通知吗(拼多多降权会通知顾客吗)

    拼多多降权会通知吗(拼多多降权会通知顾客吗)

  • 解bl锁什么意思(解bl锁的好处)

    解bl锁什么意思(解bl锁的好处)

  • 华为手机一年内可以免费换屏吗(华为手机一年内屏幕碎了保修吗)

    华为手机一年内可以免费换屏吗(华为手机一年内屏幕碎了保修吗)

  • 身份id是什么意思(身份id是什么意思怎么查)

    身份id是什么意思(身份id是什么意思怎么查)

  • 华为手机怎么改返回键位置(华为手机怎么改按键模式)

    华为手机怎么改返回键位置(华为手机怎么改按键模式)

  • 华为如何显示充电进度(华为如何显示充电)

    华为如何显示充电进度(华为如何显示充电)

  • 微信注销一定要60天吗(微信注销一定要60天,手机号可以立马重新注册吗)

    微信注销一定要60天吗(微信注销一定要60天,手机号可以立马重新注册吗)

  • 笔记本哪个键是除以键(笔记本哪个键是调声音)

    笔记本哪个键是除以键(笔记本哪个键是调声音)

  • 星火直播有ios版吗(星火直播ios版 最新)

    星火直播有ios版吗(星火直播ios版 最新)

  • 小米9多少分钟充满电(小米9多少分钟能充满)

    小米9多少分钟充满电(小米9多少分钟能充满)

  • 手机拼多多ip在哪里查(手机拼多多ip在哪里看)

    手机拼多多ip在哪里查(手机拼多多ip在哪里看)

  • 苹果x原彩显示要不要开(苹果x原彩显示不见了什么情况)

    苹果x原彩显示要不要开(苹果x原彩显示不见了什么情况)

  • 三星充电口检测到水汽(三星充电口检测到潮湿)

    三星充电口检测到水汽(三星充电口检测到潮湿)

  • 手机版谷歌地图怎么用(手机版谷歌地图怎么打开)

    手机版谷歌地图怎么用(手机版谷歌地图怎么打开)

  • ug11.0经典界面设置(ug12.0.1经典界面设置)

    ug11.0经典界面设置(ug12.0.1经典界面设置)

  • 手环时间不对怎么设置(手环时间不对怎么调回来)

    手环时间不对怎么设置(手环时间不对怎么调回来)

  • 苹果无法验证购买日期(苹果无法验证购买信息)

    苹果无法验证购买日期(苹果无法验证购买信息)

  • 免抵退税办法不得抵扣的进项税额的会计处理
  • 资产负债表其他流动资产计算公式
  • 减免的养老保险怎么走账
  • 车辆补贴的钱最快多久到账
  • 理财产品产生的利息怎么入账
  • 12月费用1月报销的账务处理
  • 城建税有没减半
  • 甲方代付材料费合法吗
  • 独立账户负债核算内容
  • 供热企业不得抵扣的进项计算
  • 甲供材料税金如何结算
  • 汇票的票据行为有贴现吗
  • 增值税普通发票查询真伪
  • 企业的季度所得税怎么算
  • 为别人开发票先收的税金怎么入帐?
  • 运输费用 成本
  • 金蝶软件如何设置单价小数点
  • 增值税发票清单怎么导出
  • 公积金是交当月还是上月
  • 工伤后辞职了还可以报工伤
  • 公司名下商品房交易开具发票
  • 担保贷款造成的损失可以税前扣除吗?
  • 自建不动产领用原材料的进项税
  • 员工宿舍固定资产检查通知
  • 行纪人的权利
  • 建筑公司能否开材料票
  • 苹果macbook 系统
  • 国税的个税手续怎么办理
  • schost.exe - schost是什么进程 有什么用
  • iphone11 iphone10区别
  • linux sed -s
  • PHP:stream_get_transports()的用法_Stream函数
  • php可以做什么脚本
  • 委托加工物资账务怎么做
  • 图像相似性度量
  • 目标检测现状
  • 微信php源码
  • 原生js获取元素高度
  • laravel使用了哪些设计模式
  • 单位购买电水壶会计入账
  • 发票跨月发现开错该怎么办?
  • 保险公司工伤怎么赔付
  • 关联企业利息费用债资比
  • MySQL提示The InnoDB feature is disabled需要开启InnoDB的解决方法
  • 支付长期借款利息
  • 乡村道路属于城市道路吗
  • 其他应收款主要是什么
  • 发票已经认证后怎么撤销
  • 房东减免部分房租
  • 季度所得税计提分录
  • 公司股东投资是什么意思
  • 主营业务成本如何设置明细
  • 支付土地租金计入什么科目里面
  • 银行收到货款会计分录怎么做
  • 民间非营利组织包括哪些单位
  • 跨年取得的发票
  • 单独设置停工损失科目
  • 建账有哪些步骤,每个步骤有哪些注意事项
  • mysql zip archive 版本(5.7.19)安装教程详细介绍
  • 如何禁用windows defender service
  • Win7中Remote Procedure Call(RPC)服务能关闭吗
  • windows10 rs2
  • win10蓝屏stopcode
  • winxp怎么装系统
  • WINDOWS系统还原主要作用
  • nod32kui.exe - nod32kui是什么进程 作用是什么
  • u盘做pe后还能存储吗
  • win7怎么提升电脑性能
  • sqlite数据库修改及升级
  • linux中w命令详解
  • vue实现标签页效果
  • jquery ajax后台返回list,前台用jquery遍历list的实现
  • python怎么写字符串
  • 一般纳税人开租赁费发票税率是多少
  • 南通国税电子税务局
  • 城市维护建设税税率
  • 电信追缴欠费的工作方案有哪些
  • 上海税务局网上举报平台官网
  • 出口退税申报时间规定
  • 建筑工程招标代理服务费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设