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

  • 流量限速是什么意思(流量限速是什么原理)

    流量限速是什么意思(流量限速是什么原理)

  • 腾讯视频的会员号可以两个人用吗(腾讯视频的会员多少钱)

    腾讯视频的会员号可以两个人用吗(腾讯视频的会员多少钱)

  • 小麦直播能提现吗(小麦麦在哪直播)

    小麦直播能提现吗(小麦麦在哪直播)

  • 微信如何判断是被拉黑还是被删除(微信如何判断是拉黑还是删除)

    微信如何判断是被拉黑还是被删除(微信如何判断是拉黑还是删除)

  • 手机充不进电怎么办(手机充不进电怎么回事儿)

    手机充不进电怎么办(手机充不进电怎么回事儿)

  • 快手里闪回是什么意思(快手什么叫闪回)

    快手里闪回是什么意思(快手什么叫闪回)

  • maya怎么导出视频(maya怎么导出视频怎么不清晰)

    maya怎么导出视频(maya怎么导出视频怎么不清晰)

  • 苹果资源机什么意思(苹果资源机什么意思 视频)

    苹果资源机什么意思(苹果资源机什么意思 视频)

  • npu处理器有什么用(npu处理器玩游戏怎么样)

    npu处理器有什么用(npu处理器玩游戏怎么样)

  • 苹果型号ll/a什么版本(苹果型号ll是哪个国家)

    苹果型号ll/a什么版本(苹果型号ll是哪个国家)

  • 一加七pro防水嘛(一加七pro防水怎么样)

    一加七pro防水嘛(一加七pro防水怎么样)

  • 不认识的人加亲情号有风险吗(不认识的人加微信怎么办)

    不认识的人加亲情号有风险吗(不认识的人加微信怎么办)

  • 查看wifi路由器显示unknow(查看wifi路由器地址)

    查看wifi路由器显示unknow(查看wifi路由器地址)

  • i7级和i7有什么不同呢(i7级和i7的区别)

    i7级和i7有什么不同呢(i7级和i7的区别)

  • 青岛公交车可以微信支付吗(青岛公交车可以投币吗)

    青岛公交车可以微信支付吗(青岛公交车可以投币吗)

  • 全民k歌蓝牙耳机为什么没有耳返(全民k歌蓝牙耳机延迟)

    全民k歌蓝牙耳机为什么没有耳返(全民k歌蓝牙耳机延迟)

  • 怎么删除全部的页眉(怎么删除全部的qq消息)

    怎么删除全部的页眉(怎么删除全部的qq消息)

  • 小米mix3耗电快的原因(mix3耗电严重)

    小米mix3耗电快的原因(mix3耗电严重)

  • 建个网站需要什么手续(建网站需要什么软件)

    建个网站需要什么手续(建网站需要什么软件)

  • xr和7p屏幕对比(iphone7p和xr屏幕的区别)

    xr和7p屏幕对比(iphone7p和xr屏幕的区别)

  • 天猫清关材料能删除吗(天猫国际清关完成可以退款吗)

    天猫清关材料能删除吗(天猫国际清关完成可以退款吗)

  • oppo微信照片存储位置(oppo微信保存图片不在相册怎么办)

    oppo微信照片存储位置(oppo微信保存图片不在相册怎么办)

  • 哈罗顺风车有发票吗(哈罗顺风车发布行程)

    哈罗顺风车有发票吗(哈罗顺风车发布行程)

  • 苹果x能设置微信密码锁(苹果x设置微信密码锁在哪里)

    苹果x能设置微信密码锁(苹果x设置微信密码锁在哪里)

  • Redis高并发分布式锁详解(redis incr 高并发)

    Redis高并发分布式锁详解(redis incr 高并发)

  • 个税退付手续费是单位所得吗
  • 怎么知道交不交印花税
  • 营业执照是怎么样子的
  • 比赛奖金要交税么
  • 什么情况需要个人档案
  • 注册资本金入账需要缴税么
  • 法人股东分红要交企业所得税吗
  • 个税子女教育扣除需要提供什么资料
  • 什么情况需要预缴增值税
  • 银行进账单票据号码在哪里
  • 金税盘如何增加税率
  • 第一次购买税控盘
  • 增值税普通发票和普通发票的区别怎么交税
  • 已申报未导入是申报成功了吗
  • 湖北工会工作网
  • 公司为员工购买社保证明
  • 内部往来科目设置在哪类下
  • 销售产品产生的运杂费分录
  • 销售费用现金支付
  • 外资企业银行贷款限制
  • 支付保险费发票怎么入账
  • 运费营改增时间
  • 股权转让印花税是双方都要缴纳吗
  • 发票查验平台查询官网手机版App
  • 销售货物运费的增值税率
  • 购进的库存商品转自用
  • 停车场如何申领车牌号
  • 开票含税和不含税哪个划算
  • 认缴实收资本印花税什么时候交
  • 中小企业工会经费怎么算
  • 小规模纳税人三万以下免税
  • 其他应付款调整到其他应收款
  • qq画画图片大全
  • 广告费和业务宣传费
  • 财务里计提是什么意思
  • 公司招的兼职员工怎么报个税
  • linux系统应对攻击的常用防御手段的描述
  • 试乘试驾车好不好
  • pnaico.exe是什么软件
  • mac怎么删除cineware
  • 夏威夷火山国家公园
  • 商品房契税申报是增量房申报吗
  • 截取字符串php
  • php验证码识别
  • 顺流交易合并抵消
  • vue页面嵌套iframe vue页面
  • 企业成本核算应遵循
  • 培训费用是什么成本
  • 应交增值税的账务处理有哪两种
  • 房屋出租怎么开电子发票
  • 出纳把现金存入私人账户后转公账
  • Bootstrap table 控制表格高度固定(行高固定)并且不受数据量影响
  • 如何修改php
  • python中numpy.empty()函数的用法
  • SqlServer与MongoDB结合使用NHibernate
  • ubuntu下安装windows
  • 政府补贴流程
  • 企业建造的厂房属于固定成本吗
  • 国家税务总局就是国税局吗?
  • 个人转让著作权免征增值税判断题
  • 财务风险有什么类别
  • 分支机构可不可以不建账合并到总机构?
  • 公司市场部职能
  • win7安装mysql5.5
  • win10执行数据保护如何开启
  • mac如何通过终端启动
  • Cocos2d-x 3.2 Lua示例 ActionTest(动作测试)
  • cocos 2d x
  • 详解中国女足出线形势
  • 深入理解计算机系统
  • unity移动游戏开发
  • unity做app
  • 下载随手笔记
  • CloudEditText
  • python djang
  • 人力资源差额发票
  • 地税总局局长
  • 广西国家税务局于红林
  • 非居民企业所得税税率
  • 12366国税网上申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设