当前位置: 首页 > news >正文

虎门网站建设服务商网站设计与开发

虎门网站建设服务商,网站设计与开发,安装wordpress安装地址修改,wordpress团购主题一、vue-router路由变化侦测 1.1 上一遍文章中,介绍了vue-router 的install 函数的内部实现,知道了能在this中访问$router 和视图更新的机制,文章链接终于把 vue-router 运行原理讲明白了(一)!&#xff01…

一、vue-router路由变化侦测

1.1 上一遍文章中,介绍了vue-router 的install 函数的内部实现,知道了能在this中访问$router 和视图更新的机制,文章链接终于把 vue-router 运行原理讲明白了(一)!!!
下面开始介绍上一遍文章遗留的疑惑点,_route 属性值如何变化,进行剖析

 Vue.util.defineReactive(this, '_route', this._router.history.current)

1.2 我们找到 vue-router 源码的 src目录下的 router.js 文件 ,里面有一个init方法,还记得我们上一遍文章中,install 方法中,在根组件调用了这个init 方法,代码如下(经过删减,要完整代码请阅读源码)
代码中两个重要地方,history.transitionTohistory.listen

init (app: any /* Vue component instance */) {const history = this.historyif (history instanceof HTML5History || history instanceof HashHistory) {const handleInitialScroll = routeOrError => {const from = history.currentconst expectScroll = this.options.scrollBehaviorconst supportsScroll = supportsPushState && expectScrollif (supportsScroll && 'fullPath' in routeOrError) {handleScroll(this, routeOrError, from, false)}}const setupListeners = routeOrError => {history.setupListeners()handleInitialScroll(routeOrError)}history.transitionTo(history.getCurrentLocation(),setupListeners,setupListeners)}history.listen(route => {this.apps.forEach(app => {app._route = route})})}

1.3 history有三种值,分别为HTML5History(对应的是 路由的history模式)
还有hashabstract

 case 'history':this.history = new HTML5History(this, options.base)breakcase 'hash':this.history = new HashHistory(this, options.base, this.fallback)breakcase 'abstract':this.history = new AbstractHistory(this, options.base)breakdefault:if (process.env.NODE_ENV !== 'production') {assert(false, `invalid mode: ${mode}`)}

在1.2 中,init 方法执行了history 的 transitionTo 方法传入了三个参数,为当前路由路径和setupListeners

history.transitionTo(history.getCurrentLocation(),setupListeners,setupListeners)

1.4 下面我们找到transitionTo,其具体位置在 src 下面的history目录的base.js 文件,重点是 执行了confirmTransition 方法,第二个参数是一个回调方法,等异步组件准备完毕,就执行,其中有一个重要步骤,就是执行 this.updateRoute(route)

transitionTo (location: RawLocation,onComplete?: Function,onAbort?: Function) {this.confirmTransition(route,() => {this.updateRoute(route)onComplete && onComplete(route)this.ensureURL()this.router.afterHooks.forEach(hook => {hook && hook(route, prev)})},err => {})}

updateRoute 代码如下,他会判断cb存不存在,存在才执行该函数,那么这个cb到底是啥

updateRoute (route: Route) {this.current = routethis.cb && this.cb(route)}

1.5 在base.js 文件中,找到一个方法如下,看起来好像在哪里见过,没错啦,就是在执行init方法时候,

// base.jslisten (cb: Function) {this.cb = cb}

该方法就在 router.js 的init 方法中,后于 history.transitionTo 执行,因此,根组件是不会执行 app._route = route 这个方法

 // router.js 的 init方法中执行  history.listenhistory.listen(route => {this.apps.forEach(app => {app._route = route})})

那执行这个方法有啥用呢,我们在1.1 中见过,一旦该值发生变化,便会通知vue更新视图。那么,什么时候才会执行这个方法呢

二、_route 变化时机

2,1 在 history.transitionTo 中 还有一个重要的方法 setupListeners

history.transitionTo(history.getCurrentLocation(),setupListeners,setupListeners)

setupListeners 代码如下,

 const setupListeners = routeOrError => {history.setupListeners()handleInitialScroll(routeOrError)}

history.setupListeners() 具体位置为 html5.js 的 setupListeners ,重要代码如下,我们监听popstate 事件,(history模式下触发,hash模式触发haschange)

  window.addEventListener('popstate', handleRoutingEvent)

具体解释如下
当活动历史记录条目更改时,将触发popstate事件。如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对history.replaceState()的调用的影响,popstate事件的state属性包含历史条目的状态对象的副本。

也就是触发 pushState或者 history.replaceState就会触发 popstate 事件,然后执行 handleRoutingEvent 函数,他会执行 this.transitionTo 函数,也就是执行 updateRoute 函数
就是说 我们一旦执行history.pushState或者 history.replaceState 就会更新_route 的值

三、pushState或者 replaceState执行机制

3.1 我们在route的push方法中发现如下代码,是不是很眼熟,就是我们平时调用的 this.$router.push 代码的执行逻辑,这个方法中 执行了history.push

 push (location: RawLocation, onComplete?: Function, onAbort?: Function) {console.log("执行push逻辑",...arguments)// $flow-disable-lineif (!onComplete && !onAbort && typeof Promise !== 'undefined') {return new Promise((resolve, reject) => {this.history.push(location, resolve, reject)})} else {this.history.push(location, onComplete, onAbort)}}

3.2 我们在html5.js 中找到history的push方法,其中就执行 pushState

push (location: RawLocation, onComplete?: Function, onAbort?: Function) {const { current: fromRoute } = thisthis.transitionTo(location, route => {pushState(cleanPath(this.base + route.fullPath))handleScroll(this.router, route, fromRoute, false)onComplete && onComplete(route)}, onAbort)}

也就是说,当我们调用this.$router.push 或者replace 时候就会触发 popstate 事件的监听,从而触发_route 更新,最后通知vue更新视图,一切新的视图就会展现在我们面前啦

http://www.zhongyajixie.com/news/13433.html

相关文章:

  • 宜宾商城网站建设汕头网站设计公司
  • 百度做网站的公司推广营销企业
  • 汕尾北京网站建设如何进行网站推广?网站推广的基本手段有哪些
  • 如何做b2b网站信息简单的网站制作
  • 几年前备案的网站现在网站不在了备案号还在吗韩国搜索引擎排名
  • 长春火车站24小时人工客服电话网络营销是以什么为基础
  • 电子商务政府网站建设谷歌seo软件
  • 门户网站开发报价单推广公司简介
  • wordpress点击分享功能长春做网站公司长春seo公司
  • 做政府门户网站方案怎么做宣传推广
  • 如何破解网站后台密码自己怎么开发app软件
  • 网站开发回扣设计网站官网
  • 无锡 学校网站建设如何优化百度seo排名
  • 网站型和商城型有什么区别搜索引擎名词解释
  • 专业团队建设实施方案北京seo学校
  • 360网站建设商家百度竞价推广怎么做
  • wordpress4.8速度慢郑州seo优化公司
  • 查询企业的app哪个好seo排名关键词
  • 腾讯客服网站在线客服怎么推广app让人去下载
  • 网页网站关系网站源码下载
  • 设备租赁业务网站如何做培训机构退费纠纷一般怎么解决
  • 宿州网站制作建设推广软文范例100字
  • 对于新闻网站运营问题今天刚刚的最新新闻
  • 石家庄网页设计招聘公司seo是什么级别
  • 返利的网站怎么做2022年适合小学生的新闻
  • 保定哪里做网站app推广拉新平台
  • 网站的风格网络热词2023
  • 静态购物网站模板怎么在网上做广告
  • 广州一网通办注册公司流程宣城网站seo
  • b2b独立站建站博客seo怎么做