Vue-Router 源碼學習之我們從API中看些門道

Vue-Router 源碼學習之我們從API中看些門道

前言

這次真的是太久太久沒見了,夥伴們。不過…

學習真的沒有鬆懈,只是季度末要衝一衝績效,一下子把時間都充值了。(ps:我看應該是我的腦子需要充值)

今天帶來的依舊是Vue-Router的內容,畢竟是一個系列文章~

聊聊題目

為什麼要從API中看門道呢?

我們在使用vue-router的時候,其實就是按照API進行操作,而我們查看的源碼其實就是API的一種存在形式。隨著我對源碼深入的學習,也發現很多內容並不適合直接上乾貨,因為太乾了,所以開門見山反而效果不好。所以今天這篇文章是一個過渡章節,為接下來的內容扮演一個承上啟下的角色。

因此這篇文章,讓我們一起聊一聊API~

我們的push有哪些情況?

在實際工作中,編程式導航要比標籤使用的多的多,複雜邏輯中嵌套路由跳轉都是要使用編程式導航。

Vue-Router 源碼學習之我們從API中看些門道

在編程式路由中,我們可以接收一個對象、一個字符串,對象的key有path、name、query、params等等,但是需要相互組合。

這麼多情況vue-router要對push這麼多情況做一個處理,我們push接收的參數的類型是什麼?用flow設定為Location、RawLocation

Vue-Router 源碼學習之我們從API中看些門道

翻譯過來就是未處理的、生的路徑。所以我們的push操作傳遞的是一個生冷的路徑,經過一次match的處理

Vue-Router 源碼學習之我們從API中看些門道

變成vue-router所需要的結構,route類型

Vue-Router 源碼學習之我們從API中看些門道

所以從API結合表層源碼來看,我們在進行編程式導航時的過程,先將未處理的路徑(ps:vue-router對這種未處理路徑沒法直接進行跳轉等操作)處理成一個規範的route類型,然後進行具體的路由跳轉內容。

命名路由與視圖

Vue-Router 源碼學習之我們從API中看些門道

一個組件內可以有多個router-view組件,我接觸的幾個項目都是維護一個根結點的router-view。大部分都是這種結構

Vue-Router 源碼學習之我們從API中看些門道

我們一個路徑下可以展示多個路由視圖組件嗎?

答案當然是肯定的,官方的命名視圖的例子(https://jsfiddle.net/posva/22wgksa3/)

可以看到,我們在同一個路徑下可以放置多個,這裡面的name與我們在構造vue-router時設置的components有對應,我們一般都是component : xxx;對應一個組件。如何對應多個的呢?

Vue-Router 源碼學習之我們從API中看些門道

其實人家本身希望你用components,你要只用一個人家就給你包裝成一個map,key呢就是默認值的意思。

再看看我們的vue-router2開始的路由守衛

路由守衛有哪些呢?

  • 1:全局的beforeEach
  • 2:單個路由配置的beforeEnter
  • 3:全局的afterEach
  • 4:組件內的路由守衛:
  • beforeRouteEnter
  • beforeRouteUpdate (2.2 新增)
  • beforeRouteLeave
  • 5:全局的beforeResolve(vue-router2.5新增)

別的守衛還有嗎?這麼看來是沒有了。

全局的beforeEnter、afterEach、beforeResolve為什麼會作用在每一個路由配置中呢?在index一章中,我們有三個存放守衛的數組大家還有印象嗎?

Vue-Router 源碼學習之我們從API中看些門道

在router實例中存儲這些。所以我們在做路由跳轉的時候可以拿到這些守衛,其餘的守衛怎麼辦?只好在跳轉的時候具體情況具體執行,

守衛分為三個種類:

1:離開組件之前;2:進入組件(前後都有守衛);3:更新組件之前。

所以一個路由的跳轉一定伴隨著如下幾個步驟:

  • 1:跳轉我們稱之為transitionTo
  • 2:那麼跳轉中進行一個confirmTransiton(跳轉前的準備)
  • 3:跳轉結束時進行一個updateRoute的過程。

上述步驟中提到的confirmTransition:先收集到所有的守衛,把前置守衛們(前置!!!)連接成一個數組,跳轉前挨個執行,前置守衛執行完怎麼辦?都通過來,那就更新當前路由,更新完當前路由就執行一下後置守衛。

vue-router源碼中:

核心的路由跳轉方法就是transitionTo:

具體內容是由confirmTransition與updateRoute實現的

Vue-Router 源碼學習之我們從API中看些門道

其餘的一些這這那那的容錯,並不影響主流程。

總結一下

對於push、replace傳遞的未處理的路徑,進行處理成vue-router可以操作的路徑。

對於多個router-view,我們可以選擇children,components來實現。

路由守衛為什麼可以有全局的,每個路由都可以用,因為在router實例上,我們每次跳轉都可以找到。

路由跳轉經歷了confirm確認與update更新兩步。

結束語

中秋節剛剛過去,十一馬上就到了:

沒有來得及給大家帶來祝福,希望大家十一的時候每次路由跳轉都不堵車!

最後如果各位小夥伴覺得文章寫的還不錯,記得分享給自己身邊還在編程這條路上的小夥伴們呦~每一個前端er(boy and girl),你們都不是一個人在戰鬥~


分享到:


相關文章: