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

  • 蓝牙耳机怎么用一个关一个(蓝牙耳机怎么用)(蓝牙耳机怎么用充电仓充电)

    蓝牙耳机怎么用一个关一个(蓝牙耳机怎么用)(蓝牙耳机怎么用充电仓充电)

  • 荣耀30pro+刷新率是多少(荣耀30Pro刷新率)

    荣耀30pro+刷新率是多少(荣耀30Pro刷新率)

  • 微信加好友提示操作频繁怎么办(微信加好友提示操作频繁是怎么回事)

    微信加好友提示操作频繁怎么办(微信加好友提示操作频繁是怎么回事)

  • 苹果xs64g够用吗

    苹果xs64g够用吗

  • wps怎么截图一整页(wps怎么截图一整页不能往下拉)

    wps怎么截图一整页(wps怎么截图一整页不能往下拉)

  • 为什么b站不能投屏(为什么b站不能上传nba的视频)

    为什么b站不能投屏(为什么b站不能上传nba的视频)

  • 电表显示跳闸黄灯(电表显示跳闸黄灯一直亮着怎么解决)

    电表显示跳闸黄灯(电表显示跳闸黄灯一直亮着怎么解决)

  • qq显示电量一直不刷新(为什么qq显示电量一直都是充电中)

    qq显示电量一直不刷新(为什么qq显示电量一直都是充电中)

  • 淘宝外围正向和反向什么意思(淘宝外围活动有必要参加吗)

    淘宝外围正向和反向什么意思(淘宝外围活动有必要参加吗)

  • 6sp电池容量多少毫安(苹果6sp电池最大容量)

    6sp电池容量多少毫安(苹果6sp电池最大容量)

  • power是什么功能(power是什么按钮)

    power是什么功能(power是什么按钮)

  • 快手注销条件1不通过(快手注销账号要什么条件)

    快手注销条件1不通过(快手注销账号要什么条件)

  • 拉黑并且删除怎么知道(拉黑并且删除怎么拉回来)

    拉黑并且删除怎么知道(拉黑并且删除怎么拉回来)

  • 苹果11手机屏刮花怎么办(苹果手机屏刮花了怎么修复)

    苹果11手机屏刮花怎么办(苹果手机屏刮花了怎么修复)

  • 微信退群有通知吗(微信退群的人聊天记录还在吗)

    微信退群有通知吗(微信退群的人聊天记录还在吗)

  • iphone11小白点怎么开(iphone11小白点怎么设置返回上一级)

    iphone11小白点怎么开(iphone11小白点怎么设置返回上一级)

  • ps怎么把rgb改成cmyk(ps怎么把rgb改为cmyk)

    ps怎么把rgb改成cmyk(ps怎么把rgb改为cmyk)

  • 华为手机屏幕突然一闪一闪(华为手机屏幕突然变黄了怎么办)

    华为手机屏幕突然一闪一闪(华为手机屏幕突然变黄了怎么办)

  • 序列号d开头是啥意思(序列号d开头是最差的吗)

    序列号d开头是啥意思(序列号d开头是最差的吗)

  • 快手别人发的作品怎么下载(快手上自己发布的作品别人怎么看到)

    快手别人发的作品怎么下载(快手上自己发布的作品别人怎么看到)

  • 手机怎么注销qq号(手机怎么注销qq吃鸡账号)

    手机怎么注销qq号(手机怎么注销qq吃鸡账号)

  • 刷宝怎么自动播放下一个视频(刷宝短视频怎么自动刷)

    刷宝怎么自动播放下一个视频(刷宝短视频怎么自动刷)

  • 抖音里的逗拍在哪(抖音逗拍怎么找这功能)

    抖音里的逗拍在哪(抖音逗拍怎么找这功能)

  • 组装机清单(组装机各个配件详解)

    组装机清单(组装机各个配件详解)

  • 复制的文件在手机那能找到(复制的文件在手机哪里)

    复制的文件在手机那能找到(复制的文件在手机哪里)

  • Opencv学习之:将图片的值进行范围调整 cv2.normalize()(opencv语句)

    Opencv学习之:将图片的值进行范围调整 cv2.normalize()(opencv语句)

  • 帝国CMS商城系统实现在线支付后发送订单邮件提醒功能(帝国cms商城教程)

    帝国CMS商城系统实现在线支付后发送订单邮件提醒功能(帝国cms商城教程)

  • 税务申报退税
  • 一般纳税人开劳务专票多少个点
  • 土地增值税纳税义务人
  • 人力资源行业税务政策
  • 发票盖了财务专用章旁边再盖发票章
  • 小规模纳税人外账处理
  • 公司可以为非本人开户吗
  • 财务方面的管理思想
  • 丢失发票罚款如何入账
  • 结转应交所得税属于利润分配吗
  • 增值税专用发票抵扣期限
  • 2018年终奖个人所得税计算器公式
  • 销售折扣和销售折让的账务处理
  • 融资租赁开始时的账务处理
  • 1697509422
  • 将原材料变成成品的过程
  • 少数股东持股比例
  • 怎么给自己的宽带改名字
  • 预缴税款忘记抵扣
  • UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
  • uniapp h5发布
  • 企业研发费用可以只加计一半吗
  • 怎么关闭win10搜索栏
  • 存货资产减值损益怎么算
  • phpcms怎么用
  • upload靶场搭建
  • yolo xml转txt
  • 定额发票丢失了怎么补办
  • transformer的解码器
  • web渗透违法吗
  • javaweb会话跟踪技术有哪些
  • vue3 原理
  • 增值税发票如何认证抵扣
  • 销售退货和折让是收入吗?吗?
  • 其他免税销售额怎么算
  • 年终奖税金怎么扣
  • 官方的问答
  • mongodb修改命令
  • 公司茶水间管理规定
  • 契税计入税金及附加吗东奥
  • 不征税收入与免税收入有哪些
  • 空调维修保养方案
  • 发票盖错章怎么擦掉
  • 暂估入库没有票怎么冲掉
  • 混合销售举例说明
  • 预付款项属于什么会计要素
  • 健身器材折旧年限及计提办法
  • 房产租赁发票
  • 将本月发生的制造费用在甲、乙产品之间
  • 购进原材料如何结转成本
  • 客户手续费率
  • 网上银行回单可以做账吗
  • 现金流量表和利润表的勾稽关系
  • 企业为员工代缴社保怎样在网上申报
  • 建账时都要建哪些科目
  • macos怎么操作
  • win10系统开机蓝屏怎么修复
  • 快捷键f1怎么用不了
  • win7无法双击打开软件
  • 微软发布Win10更新
  • linux用户相关命令
  • 一、Unity3D 5.0.1-示例项目“汽车游戏”的展示及开发准备
  • Unity5 Assetbundle简单使用 及 打包Material文件超大的问题
  • react增删改查功能
  • nodejs读取json文件,并返回列表
  • cmd进入控制面板代码
  • opengl绘制一个矩形
  • react native usestate
  • mysql源码安装和二进制安装
  • javascript总结笔记
  • python asyncio
  • 安卓中px,dp,sp的区别
  • 广东省电子税务局官网登录入口
  • 企业销售旧货增值税税率
  • 通用定额发票分经营类型吗
  • 包装物押金的计算
  • 你需要了解什么 英语
  • 福建省茶叶协会会长名单
  • 南通工伤网上申请流程
  • 国际税务网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设