路由在執行過程中對元件無狀態操作,即路由離退時元件狀態也一併刪除;當然在絕大多數場景下這是合理的。
但有時一些特殊需求會讓人半死亡狀態,當然這一切都是為了用戶體驗;一種非常常見場景,在行動端中用戶透過關鍵字搜尋商品,而死不死的這樣的列表通常都會是自動下一頁動作,此時用戶好不容易滾動到第二頁並找到想要看的商品時,路由至商品詳情頁,然後一個後退……用戶懵逼了。
Angular路由與元件一開始就透過 RouterModule.forRoot
形成一種關係,當路由命中時利用 ComponentFactoryResolver
建構元件,這是路由的本質。
而每一個路由並不一定是一次性消費,Angular 利用RouteReuseStrategy
貫穿路由狀態並決定建立元件的方式;當然預設(DefaultRouteReuseStrategy)像開頭說的,一切都不進行任何處理。
RouteReuseStrategy
從2就已經是實驗性,目前依然如此,這麼久應該是可信任。
RouteReuseStrategy
我稱它為:路由複用策略;並不複雜,提供了幾種辦法簡單易懂的方法:
shouldDetach
是否允許複用路由
store
當路由離開時會觸發,儲存路由
shouldAttach
是否允許還原路由
##retrieve 取得儲存路由
shouldReuseRoute 進入路由觸發,是否同一路由時復用路由
/list 設定為允許復用(
shouldDetach),然後將路由快照存在
store 當中;當
shouldReuseRoute 成立時即:再次遇到
/list 路由後表示需要重複使用路由,先判斷
shouldAttach 是否允許還原,最後從
retrieve拿到路由快照並建構組件。
RouteReuseStrategy 介面即可自訂一個路由利用策略。
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 進入路由觸發,判斷是否相同路由
providers: [ { provide: RouteReuseStrategy, useClass: SimpleReuseStrategy } ]假設我們有這麼一個路由配置:
RouterModule.forRoot([ { path: 'search', component: SearchComponent }, { path: 'edit/:id', component: EditComponent } ])搜尋元件用於搜尋動作,並在根據搜尋結果跳轉至編輯頁,儲存後又回到最後搜尋結果的狀態(這部分程式碼我就不貼有興趣見plnkr)。 四、結論上述只是一個簡單的拋磚引玉作用,實則對於復用的判斷會更複雜、滾動條位置、緩存清理等等。 善用這種路由復用策略機制可以解決很多Web體驗上的問題。
以上是Angular路由復用策略的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!