首页 > 其他 > 详细

vue-router源码随笔2

时间:2020-06-14 20:33:34      阅读:65      评论:0      收藏:0      [点我收藏+]
 

执行完Vue实例的beforeCreate钩子函数之后,接下解析<router-Link>和<router-view>这两个组件,并渲染到页面中。执行组件的render方法,

// 可以忽略,只需要知道是把to(目标组件)路径格式化,
// route 为location匹配到在Router中的路由对象,
// href和完整的链接。这里涉及到很多比较难看的函数,要抽象出来,不要绕
//进去
const { location, route, href } = router.resolve(
   this.to,
   current,
   this.append
 )

 

 整个render都是在围绕构造虚拟Dom的data对象。其中对slot和tag进行了处理,总的来说,可以先忽略细节,认识到作用。<router-view>是个函数组件(也就是说它只是展示,没有数据监听,

没有this,没有钩子函数,它的render函数的第二个参数为render函数执行的上下文),router-view渲染之前注册了三个钩子函数:registerRouteInstance(组件初始beforeCreate执行)、

prepatch、init,这些钩子函数会在组件patch阶段按顺序一一执行,最终渲染当前route的组件。通过上面的解析,重点在于:
const route = parent.$route    //route是怎么变化的,这个变化会导致页面重新渲染。
const matched = route.matched[depth]

 $route变化在每个History实例中的调用transitionTo引起的,

/* 给app 为 Vue实例*/
history.listen(route => {
      this.apps.forEach((app) => {
        app._route = route
      })
})
// 把listen赋值给History的回调函数
listen (cb: Function) {
   this.cb = cb
}
// 这个cb在update钩子函数中执行
updateRoute (route: Route) {
    this.current = route
    this.cb && this.cb(route)
}
// _router的变化导致页面更新
Vue.util.defineReactive(this, ‘_route‘, this._router.history.current)

而updateRouter在confirmTransition()中执行,confirmTransition又是transitionTo里执行。confirmTransition是vue-router难点,它涉及到导航的守护钩子函数。

vue-router源码随笔2

原文:https://www.cnblogs.com/liuyinlei/p/13126225.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!