位置: 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)

  • 我从站长之家这里学会了写原创文章(站长之家怎么用)

    我从站长之家这里学会了写原创文章(站长之家怎么用)

  • 快手极速版退出登录在哪(快手极速版退出登录后怎么找回原来的号?)

    快手极速版退出登录在哪(快手极速版退出登录后怎么找回原来的号?)

  • oppo有实况模式吗(oppo有没有实况)

    oppo有实况模式吗(oppo有没有实况)

  • 如何恢复误删的华为手机软件(如何恢复误删的微信好友)

    如何恢复误删的华为手机软件(如何恢复误删的微信好友)

  • 华为nove7与nove7se的区别在哪里(华为nove7与nove10对比)

    华为nove7与nove7se的区别在哪里(华为nove7与nove10对比)

  • 苹果手机最上面一行时间不显示了(苹果手机最上面的横槽是什么)

    苹果手机最上面一行时间不显示了(苹果手机最上面的横槽是什么)

  • 黑鲨什么时候出5g手机(黑鲨什么时候出7)

    黑鲨什么时候出5g手机(黑鲨什么时候出7)

  • pixiv怎么注册不了(pixiv手机注册不了怎么办)

    pixiv怎么注册不了(pixiv手机注册不了怎么办)

  • 拼多多缺货违规资金限制多久(拼多多缺货违规资金限制是什么意思)

    拼多多缺货违规资金限制多久(拼多多缺货违规资金限制是什么意思)

  • 华为nova4可以当遥控器吗(华为nova4可以装支持电信卡吗?)

    华为nova4可以当遥控器吗(华为nova4可以装支持电信卡吗?)

  • wps中图片重新着色在哪里(wps图片重新着色自定义颜色)

    wps中图片重新着色在哪里(wps图片重新着色自定义颜色)

  • 网络存在安全风险是什么原因(网络存在安全风险怎么设置)

    网络存在安全风险是什么原因(网络存在安全风险怎么设置)

  • xr可以更新ios13吗(xr可以更新ios17吗)

    xr可以更新ios13吗(xr可以更新ios17吗)

  • 微信语音通话久了中断(微信语音通话久了会断吗)

    微信语音通话久了中断(微信语音通话久了会断吗)

  • 苹果手机天气冷掉电快怎么办(苹果手机天气冷屏幕失灵)

    苹果手机天气冷掉电快怎么办(苹果手机天气冷屏幕失灵)

  • 苹果8有没有人像模式(苹果8有没有人脸识别解锁)

    苹果8有没有人像模式(苹果8有没有人脸识别解锁)

  • i59400f配什么主板(i59400f配什么主板可以超频)

    i59400f配什么主板(i59400f配什么主板可以超频)

  • ipad和iphone的区别(ipad和苹果有什么区别)

    ipad和iphone的区别(ipad和苹果有什么区别)

  • 手机耳机可以插在电脑上用吗(手机耳机可以插mp3吗)

    手机耳机可以插在电脑上用吗(手机耳机可以插mp3吗)

  • u盘装机缺少硬盘驱动(u盘安装系统缺少硬盘驱动)

    u盘装机缺少硬盘驱动(u盘安装系统缺少硬盘驱动)

  • 如何把word设置16开(如何把word设置为豆沙绿)

    如何把word设置16开(如何把word设置为豆沙绿)

  • 苹果手机识别不了小程序二维码(苹果手机识别不到sim卡)

    苹果手机识别不了小程序二维码(苹果手机识别不到sim卡)

  • 拼多多怎样添加品牌(拼多多怎样添加好友)

    拼多多怎样添加品牌(拼多多怎样添加好友)

  • 手机下载的安装包在哪里(手机下载的安装包删除了如何找回)

    手机下载的安装包在哪里(手机下载的安装包删除了如何找回)

  • vivoz3防水吗(vivoz3x防水吗)

    vivoz3防水吗(vivoz3x防水吗)

  • 华为bnd-al00是什么型号(华为bnd-aloo是什么型号)

    华为bnd-al00是什么型号(华为bnd-aloo是什么型号)

  • 全民k歌如何解除私密(全民k歌如何解绑身份证)

    全民k歌如何解除私密(全民k歌如何解绑身份证)

  • 苹果耳机怎么充电(苹果耳机怎么充不进去电)

    苹果耳机怎么充电(苹果耳机怎么充不进去电)

  • 升级到dedecms 5.7文档关键词代码部分细节警示(升级到miui14感觉耗电快了)

    升级到dedecms 5.7文档关键词代码部分细节警示(升级到miui14感觉耗电快了)

  • 集装箱维护是做什么的
  • 六大往来科目重分类分录
  • 购买生产设备上税怎么算
  • 已开发票查询不到怎么回事
  • 企业没有进项发票又开出很多发票
  • 企业清算货币资金怎么算
  • 小规模纳税人实收资本印花税如何交
  • 公司冲账发票做不够该如何处理合适?
  • 贷款计提利息会计分录
  • 另一个公司代付公司的水电费
  • 抵扣上月留抵税额的分录
  • 采购发票几个点的税
  • 应交税金在贷方怎么调
  • 地税有哪些税种类型
  • 国税变更办税人怎么变更
  • 进项票异常如何自查
  • 7月1日起,中药生产企业增值税税率为多少?
  • 国产设备购置投资由设备原价与什么构成
  • 购买用于产品设计拍摄的道具怎么做账?
  • 工程中材料超耗怎么处理
  • 建筑业调试费进什么科目?
  • 自然人独资企业和一人有限责任公司
  • 应交税费应交增值税的三级科目有哪些
  • 苹果13promax哪个颜色最贵
  • 常见的linux系统磁盘
  • 月末一次加权平均法是什么意思
  • 低值易耗品包括哪些内容?属于什么科目?
  • 职工福利费算职工薪酬吗
  • 远程桌面连接失败了
  • 单位向员工出租房屋要交增值税吗
  • 使用与保养
  • 长期挂账的其他应付账款怎么处理
  • win7家庭组怎么用
  • PHP:mcrypt_module_get_supported_key_sizes()的用法_Mcrypt函数
  • 预测编码方式
  • vue3组件写法
  • 会计中持有至到期投资是什么意思
  • 结转去年成本
  • php怎么写数据库
  • php面试知识点
  • 提取法定盈余公积的公式
  • vscode yaml插件
  • c语音中static
  • 被投资企业清算,长期股权投资处理
  • 代扣代缴手续费返还账务处理
  • 小规模纳税人免税额度是多少
  • 当月收入可以下月开票吗
  • mysql 指定my.cnf
  • 关于税务机关扣押程序
  • 付款人和开票人必须相符吗
  • 房地产开发产品科目设置
  • 无法收回的款项
  • 当月购买固定资产需要计提吗
  • 创投收入
  • 一般纳税人开红字专用发票流程
  • 多交了社保
  • 企业开发是什么专业
  • 零余额账户出纳日记账
  • mysql 备份方式
  • sql server查询
  • 数据库中的内容怎么换行
  • Windows设置启动引导
  • linux中fi
  • 盗版win7怎么升级
  • mac的100个必备小技巧
  • 苹果的mac怎么查
  • [置顶] 混合、反走样、雾效、多边形偏移
  • nodejs搭建本地服务器运行html
  • linux如何批量执行脚本
  • 批处理中for语句的哪个参数表示目录
  • js原型作用
  • linux的cp和mv
  • ugy与ngy
  • JavaScript+html5 canvas绘制渐变区域完整实例
  • android反编译smali
  • 开具负数发票(专用发票)流程?
  • 境外承包工程款收入
  • 贵州省增值税普通发票图片
  • 没有税费种认定信息是什么意思
  • 房地产对外投资契税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设