本篇文章給大家總結分享一些vue-router的相關面試題(附答案解析),帶你梳理基礎知識,增強vue-router知識儲備,值得收藏,快來看看吧!
在單頁面應用中,不同元件之間的切換需要通過前端路由來實現。
前端路由
1.key是路徑,value是元件,用於展示頁面內容
2.工作過程:當瀏覽器的路徑改變時,對應的元件就會顯示。vue-router
的路由作用:將元件對映到路由, 然後渲染出來
主要就是
如何改變URL卻不引起頁面重新整理
如何檢測到URL變化了 【相關推薦:、】
hash 是 URL 中 #
及後面的那部分,#
後的url不會傳送到伺服器,所以改變 URL 中的 hash 部分不會引起頁面重新整理
window可以監聽onhashchange
事件變化。當hash變化時,讀取#
後的內容,根據資訊進行路由規則匹配,通過改變 window.location.hash
改變頁面路由。
改變URL的三種方式
優點
hash值改變不會向後端傳送請求, 完全屬於前端路由
缺點
html5 的history Interface 中新增的pushState()
和 replaceState()
方法,用來在瀏覽歷史中新增和修改記錄,改變頁面路徑,使URL跳轉不會重新載入頁面。
類似hashchange
事件的 popstate
事件,但 popstate 事件有些不同:
只有在做出瀏覽器的行為才會呼叫 popState,使用者點選瀏覽器倒退按鈕和前進按鈕,或者使用 JavaScript 呼叫History.back()、History.forward()、History.go()方法時才會觸發。
優點
符合url地址規範, 不需要#, 使用起來比較美觀
缺點
pushState()
和 replaceState()
方法,需要特定瀏覽器的支援.$router是VueRouter的範例物件,表示整個應用的唯一路由器物件。包含了路由跳轉的方法、勾點函數等。
$route是當前路由物件,表示本元件的路由規則,每一個路由都會有一個route物件,是一個區域性物件。
- | 描述 | 如何指定跳轉的路由 | 如果沒有傳參 | 可以傳參沒有要求的值嗎 |
---|---|---|---|---|
params引數 | 路徑/params引數 | 必須要使用name指定路由 | params是路由的一部分,如果在設定了預留位置必須要有 如果這個路由有params傳參,但是在跳轉的時候沒有傳這個引數,會導致跳轉失敗或者頁面會沒有內容。 | 傳遞路徑上沒有的預留位置,位址列上不會顯示並且重新整理會丟失 |
query引數 | 路徑? key1=val1 & key2=val2.... | 1.可以使用name指定路由 2.可以使用path指定路由 | query是拼接在url後面的引數,沒有也沒關係 | query不會 |
params引數傳遞的時候,傳遞了設定預留位置接收的引數,位址列不會顯示並且重新整理會丟失。
解決辦法:可以通過this.$route.params
獲取引數儲存在本地
vue-router
提供的導航守衛主要用來通過跳轉或取消的方式守衛導航。
router.beforeEach()
全域性前置守衛,每次導航時都會觸發。router.afterEach()
全域性後置路由守衛,每次路由跳轉完成後。不會接受 next 函數,跳轉完成已經進入到元件內了router.beforResolve()
全域性解析守衛,在路由跳轉前,所有元件內守衛和 非同步路由元件 被解析之後觸發,它同樣在 每次導航 時都會觸發。 解析完成後導航被確定,準備開始跳轉。beforeRouteEnter()
路由進入元件之前呼叫,該勾點在beforeEach
和 beforeEnter
之後。beforeCreate
生命週期前觸發。beforeRouteUpdate()
this 已經可用了,所以給 next 傳遞迴撥就沒有必要了。對一個帶有動態引數的路徑 /foo/:id,在/foo/1 和/foo/2之間跳轉的時候,由於會渲染統一的Foo元件,因此這個元件範例會被複用,這個勾點在這種情況下可以被呼叫。beforeRouteLeave()
離開該元件時被呼叫,this 已經可用了,所以給 next 傳遞迴撥就沒有必要了。beforeEnter()
需要在路由設定上定義 beforeEnter 守衛,此守衛只在進入路由時觸發,在 beforeEach 之後緊隨執行,不會在 params、query 或 hash 改變時觸發。進入元件前的呼叫的順序 beforeEach()=>beforeEnter()=>beforeRouteEnter()=>beforeResolve()
這個過程不可以使用this,因為元件範例還沒有被建立,所以需要利用next函數
完整的導航解析流程
1.導航被觸發。
2.在失活的元件裡呼叫 beforeRouteLeave
守衛。
3.呼叫全域性的 beforeEach
守衛。
4.在重用的元件裡呼叫 beforeRouteUpdate
守衛。
5.在路由設定裡呼叫 beforeEnter
。
6.解析非同步路由元件。
7.在被啟用的元件裡呼叫 beforeRouteEnter
。
8.呼叫全域性的 beforeResolve
守衛。
9.導航被確認。
10.呼叫全域性的 afterEach 勾點。
11.觸發 DOM 更新。
12.呼叫 beforeRouteEnter
守衛中傳給 next 的回撥函數,建立好的元件範例會作為回撥函數的引數傳入。
keep-alive
可以實現元件快取,當元件切換時不會對當前元件進行解除安裝。
keep-alive
標籤主要是有include、exclude、max三個屬性
include
、exclude
前兩個屬性允許keep-alive
有條件的進行快取max
可以定義元件最大的快取個數,如果超過了這個個數的話,在下一個新範例建立之前,就會將以快取元件中最久沒有被存取到的範例銷燬掉。兩個生命週期activated/deactivated
,用來得知當前元件是否處於活躍狀態。
特殊的解除安裝/掛載流程:activated/deactivated
快取管理:LRU(Least Recently Used)最近最少使用是一種淘汰演演算法
特殊的解除安裝/掛載流程
由於不能將元件真正的解除安裝,所以keep-alive是將元件從原容器移動到另外一個假容器中,實現假解除安裝。掛載的時候從隱藏容器中再搬運到原容器。對應到元件的activated
和deactivated
生命週期
keepAlive會對內部元件(需要被快取的)進行打標記
在內部元件的vnode物件上新增keptAlive屬性,如果元件已經被快取,新增標記,表示渲染器並不會重新掛載,直接啟用即可。
快取策略:最近最少使用
使用Map物件cache來實現對元件的快取,key是vnode.type
值,value為vnode物件
,因為元件的vnode物件中存在對元件範例的參照(vnode.component
)
cache
前者用來存快取元件的虛擬dom集合keys
後者用來存快取元件的key集合根據元件ID和tag生成快取Key,並在快取物件中查詢是否已快取過該元件範例。如果存在,直接取出快取值並更新該key在keys中的位置(更新key的位置是實現LRU置換策略的關鍵)。
如果不存在,則在map物件中儲存該元件範例並儲存key值,之後檢查快取的範例數量是否超過max設定值,超過則根據LRU置換策略刪除最近最久未使用的範例(即是下標為0的那個key)。
(學習視訊分享:、)
以上就是【整理分享】一些vue-router相關面試題(附答案解析)的詳細內容,更多請關注TW511.COM其它相關文章!