本文主要介紹了淺談Angular路由復用策略,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。
一、引言
路由在執行過程中對元件無狀態操作,即路由離退時元件狀態也一併刪除;當然在絕大多數場景下這是合理的。
但有時一些特殊需求會讓人半死亡狀態,當然這一切都是為了用戶體驗;一種非常常見場景,在行動端中用戶透過關鍵字搜尋商品,而死不死的這樣的列表通常都會是自動下一頁動作,此時用戶好不容易滾動到第二頁並找到想要看的商品時,路由至商品詳情頁,然後一個後退……用戶懵逼了。
Angular路由與元件一開始就透過 RouterModule.forRoot 形成一種關係,當路由命中時利用ComponentFactoryResolver 建構元件,這是路由的本質。
而每一個路由並不一定是一次性消費,Angular 利用 RouteReuseStrategy 貫穿路由狀態並決定構建組件的方式;當然默認情況下(DefaultRouteReuseStrategy)像開頭說的,一切都不進行任何處理。
RouteReuseStrategy 從2就已經是實驗性,目前依然如此,這麼久應該是可信任。
二、RouteReuseStrategy
RouteReuseStrategy 我稱它為:路由復用策略;並不複雜,提供了幾種辦法通俗易懂的方法:
shouldDetach 是否允許複用路由
store 當路由離開時會觸發,儲存路由
shouldAttach是否允許還原路由
retrieve 取得儲存路由
#shouldReuseRoute 進入路由觸發,是否同一路由時復用路由
#這看起來就像是一個時間軸關係,用一種白話文像是這樣:把路由/list 設定為允許復用(shouldDetach),然後將路由快照存在store 當中;當shouldReuseRoute 成立時即:再次遇到/list 路由後表示需要重複使用路由,先判斷shouldAttach 是否允許還原,最後從retrieve 拿到路由快照並建構元件。
當理解這原理時,假如我們拿開頭搜尋清單回傳的問題就變得非常容易解決。
三、一個範例
誠如上面所說明的,只需要實作 RouteReuseStrategy 介面即可自訂一個路由利用策略。
1、建立策略
import {RouteReuseStrategy, DefaultUrlSerializer, ActivatedRouteSnapshot, DetachedRouteHandle} from '@angular/router'; export class SimpleReuseStrategy implements RouteReuseStrategy { _cacheRouters: { [key: string]: any } = {}; shouldDetach(route: ActivatedRouteSnapshot): boolean { return true; } store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void { this._cacheRouters[route.routeConfig.path] = { snapshot: route, handle: handle }; } shouldAttach(route: ActivatedRouteSnapshot): boolean { return !!this._cacheRouters[route.routeConfig.path]; } retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle { return this._cacheRouters[route.routeConfig.path].handle; } shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { return future.routeConfig === curr.routeConfig; } }
定義一個 _cacheRouters 用於快取資料(路由快照及目前元件實例物件)。
shouldDetach 直接傳回 true 表示對所有路由允許復用
store 當路由離開時會觸發。按path作為key儲存路由快照&元件目前實例物件;path等同RouterModule.forRoot中的配置。
shouldAttach 若path 在快取中有的都認為允許還原路由
retrieve 從快取中取得快照,若無則傳回null
shouldReuseRoute 進入路由觸發,判斷是否同一路由
2、註冊
最後將策略註冊到模組當中:
providers: [ { provide: RouteReuseStrategy, useClass: SimpleReuseStrategy } ]
假設我們有這麼一個路由配置:
RouterModule.forRoot([ { path: 'search', component: SearchComponent }, { path: 'edit/:id', component: EditComponent } ])
搜尋元件用於搜尋動作,並在根據搜尋結果跳轉至編輯頁,保存後又回到最後搜尋結果的狀態(這部分代碼我就不貼有興趣見plnkr)。
四、結論
上述只是一個簡單的拋磚引玉作用,實則對於復用的判斷會更複雜、滾動條位置、緩存清理等等。
善用這種路由復用策略機制可以解決很多Web體驗上的問題。
相關推薦:
以上是Angular路由復用實作策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!