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

  • 真我q3s电池容量是多少(真我q3pro电池容量)

    真我q3s电池容量是多少(真我q3pro电池容量)

  • 苹果13分辨率怎么调(苹果13分辨率怎么调1920*1080)

    苹果13分辨率怎么调(苹果13分辨率怎么调1920*1080)

  • 微信添加电话的方法是什么(微信上加电话怎么加上)

    微信添加电话的方法是什么(微信上加电话怎么加上)

  • 荣耀30pro支持指关节截屏的吗(荣耀30pro支持指关节截屏吗)

    荣耀30pro支持指关节截屏的吗(荣耀30pro支持指关节截屏吗)

  • 荣耀9x解锁方式(荣耀9x锁屏密码忘记了怎么解锁)

    荣耀9x解锁方式(荣耀9x锁屏密码忘记了怎么解锁)

  • 谷歌play点登录没反应(谷歌play点登录没反应如何解决)

    谷歌play点登录没反应(谷歌play点登录没反应如何解决)

  • 微信被删除好友能看到换头像吗(微信被删除好友聊天记录怎么恢复)

    微信被删除好友能看到换头像吗(微信被删除好友聊天记录怎么恢复)

  • 换系统对电脑有什么影响(换系统对电脑有影响吗)

    换系统对电脑有什么影响(换系统对电脑有影响吗)

  • 微信超过10m文件怎么发送(微信超过10m文件怎么打开)

    微信超过10m文件怎么发送(微信超过10m文件怎么打开)

  • x79主板配什么cpu(x79主板配什么cpu性价比最高)

    x79主板配什么cpu(x79主板配什么cpu性价比最高)

  • apple京东自营店是真的吗(apple京东自营店和苹果官网有区别吗)

    apple京东自营店是真的吗(apple京东自营店和苹果官网有区别吗)

  • 打印机不吸纸是什么原因(打印机不吸纸是什么原因 惠普108)

    打印机不吸纸是什么原因(打印机不吸纸是什么原因 惠普108)

  • 屏幕漏液是内屏坏了吗(手机屏幕漏液换内屏还是外屏)

    屏幕漏液是内屏坏了吗(手机屏幕漏液换内屏还是外屏)

  • 手机关机微信运动是不是就不会有了(手机关机微信运动会更新吗)

    手机关机微信运动是不是就不会有了(手机关机微信运动会更新吗)

  • 十代酷睿上市时间(十代酷睿什么时候出的)

    十代酷睿上市时间(十代酷睿什么时候出的)

  • 淘宝网创办于哪一年(淘宝网创办哪一年)

    淘宝网创办于哪一年(淘宝网创办哪一年)

  • 华为智能遥控在哪下载(华为智能遥控在哪)

    华为智能遥控在哪下载(华为智能遥控在哪)

  • 苹果耳机airpods怎么切歌(苹果耳机airpods三代怎么连接)

    苹果耳机airpods怎么切歌(苹果耳机airpods三代怎么连接)

  • 华为手机怎么设置定位(华为手机怎么设置指纹解锁)

    华为手机怎么设置定位(华为手机怎么设置指纹解锁)

  • 怎么注销处一周cp账号(注销的步骤)

    怎么注销处一周cp账号(注销的步骤)

  • 手机相册视频占内存怎么办(手机相册视频太多内存不足)

    手机相册视频占内存怎么办(手机相册视频太多内存不足)

  • 手机号码如何查身份证(手机号码如何查找对方的位置)

    手机号码如何查身份证(手机号码如何查找对方的位置)

  • 拼多多乐善好施签怎么使用(拼多多 乐其)

    拼多多乐善好施签怎么使用(拼多多 乐其)

  • PS中参考线如何改颜色(ps中参考线如何显示)

    PS中参考线如何改颜色(ps中参考线如何显示)

  • excel制作表格有什么方法(excell做表格)

    excel制作表格有什么方法(excell做表格)

  • 多交了企业所得税,下年度退税,需要更正撒意思
  • 报销为什么不能多家赔付
  • 增值税现代服务业6大行业
  • 合同负债属于负债吗
  • 个人所得税B表和C表
  • 企业股利分配政策有哪些
  • 补充医疗保险应享尽享方案
  • 房地产公司固定资产管理制度
  • 车位出售时要交什么税
  • 冲销上月收入
  • 代发工资开票内容
  • 原材料采用实际成本法核算
  • 增值税发票的地址已变更过怎么办
  • 免税销售额收入不含税收入怎么算
  • 房产税税率2023税率表
  • 健身行业的税务政策
  • 防伪税控开票系统SOAP服务端
  • 怎么核算外汇业务
  • 涂料厂生产销售的涂料要交消费税吗
  • 外贸企业出口退税账务处理
  • 增值税电子缴款凭证在哪里打印
  • 宿舍管理制度规定心得体会范文
  • 加速折旧的会计分录
  • linux的sh
  • 固定资产进项税额怎么做账
  • 项目的投入资金预算表
  • 公司股权变更要换营业执照吗
  • 端游上古世纪
  • mac鼠标移动到角落立刻显示桌面
  • php语言之mysql操作
  • Yosemite使用技巧 如何使用Yosemite mac信息功能共享电脑屏幕教程
  • linux字体不清晰
  • 银行对公账户收款码
  • 进程aissca.exe
  • 自建办公楼装修效果图
  • php 函数作为参数
  • php关闭错误报告
  • axios请求设置超时时间
  • 公司更衣柜费用怎么算
  • 出租包装物五五摊销法分录例题
  • 人体姿态识别国内外研究现状
  • 报个税收入需要减去扣款金额吗
  • jvm jmm
  • 织梦如何添加浮动广告
  • sqlserver2005安装步骤教程
  • 利息收入所得税汇算调整
  • 销售防疫物资是什么意思
  • 小微企业税款征收方式
  • 季度报表利润表本期金额怎么填
  • 贷款损失准备核销
  • 外出经营活动需要预缴税款吗2020年
  • 债券分期付息到期还本的意思
  • 工程年底结账
  • 公允价值的通俗理解
  • 票折费用是什么意思
  • mysql5.7.21安装
  • windows mobile应用下载
  • windows xp的安装
  • win10mobile官网
  • win10快捷键合集
  • 在linux中使用什么命令可以给命令起别名
  • win10系统如何删除用户账户
  • Linux系统中下载文件的wget命令操作实例
  • cocos2dx drawcall优化
  • javascript运用
  • 解决Extjs4中form表单提交后无法进入success函数问题
  • 快速掌握一个方法
  • shell中数组如何定义
  • javascript之typeof、instanceof操作符使用探讨
  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
  • 如何保养铜香炉
  • 即将发布的新能源汽车
  • jquery中keyup
  • js手势放大缩小
  • 税控盘换新盘
  • 企业所得税率2023年
  • 婚育证明可以开假的吗
  • 首问责任制的概念
  • 代理记账协会成立时间
  • 苏州汇川和深圳汇川那个好
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设