淺談Angular路由復用策略
一、引言
路由在執(zhí)行過程中對組件無狀態(tài)操作,即路由離退時組件狀態(tài)也一并被刪除;當然在絕大多數場景下這是合理的。
但有時一些特殊需求會讓人半死亡狀態(tài),當然這一切都是為了用戶體驗;一種非常常見場景,在移動端中用戶通過關鍵詞搜索商品,而死不死的這樣的列表通常都會是自動下一頁動作,此時用戶好不容易滾動到第二頁并找到想要看的商品時,路由至商品詳情頁,然后一個后退……用戶懵逼了。
Angular路由與組件一開始就透過 RouterModule.forRoot 形成一種關系,當路由命中時利用ComponentFactoryResolver 構建組件,這是路由的本質。
而每一個路由并不一定是一次性消費,Angular 利用 RouteReuseStrategy 貫穿路由狀態(tài)并決定構建組件的方式;當然默認情況下(DefaultRouteReuseStrategy)像開頭說的,一切都不進行任何處理。
RouteReuseStrategy 從2就已經是實驗性,當前依然如此,這么久應該是可信任。
二、RouteReuseStrategy
RouteReuseStrategy 我稱它為:路由復用策略;并不復雜,提供了幾種辦法通俗易懂的方法:
- shouldDetach 是否允許復用路由
- store 當路由離開時會觸發(fā),存儲路由
- shouldAttach 是否允許還原路由
- retrieve 獲取存儲路由
- shouldReuseRoute 進入路由觸發(fā),是否同一路由時復用路由
這看起來就像是一個時間軸關系,用一種白話文像是這樣:把路由 /list 設置為允許復用(shouldDetach),然后將路由快照存在 store 當中;當 shouldReuseRoute 成立時即:再次遇到 /list 路由后表示需要復用路由,先判斷 shouldAttach 是否允許還原,最后從 retrieve 拿到路由快照并構建組件。
當理解這一原理時,假如我們拿開頭搜索列表返回的問題就變得非常容易解決。
三、一個示例
誠如上面說明的,只需要實現 RouteReuseStrategy 接口即可自定義一個路由利用策略。
1、創(chuàng)建策略
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 當路由離開時會觸發(fā)。按path作為key存儲路由快照&組件當前實例對象;path等同RouterModule.forRoot中的配置。
- shouldAttach 若 path 在緩存中有的都認為允許還原路由
- retrieve 從緩存中獲取快照,若無則返回null
- shouldReuseRoute 進入路由觸發(fā),判斷是否同一路由
2、注冊
最后將策略注冊到模塊當中:
providers: [
{ provide: RouteReuseStrategy, useClass: SimpleReuseStrategy }
]
假設我們有這么一個路由配置:
RouterModule.forRoot([
{ path: 'search', component: SearchComponent },
{ path: 'edit/:id', component: EditComponent }
])
搜索組件用于搜索動作,并在根據搜索結果跳轉至編輯頁,保存后又回到最后搜索結果的狀態(tài)(這部分代碼我就不貼有興趣見 plnkr)。
四、結論
上述只是一個簡單的拋磚引玉作用,實則對于復用的判斷會更復雜、滾動條位置、緩存清理等等。
善用這種路由復用策略機制可以解決很多Web體驗上的問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
AngularJS實現給動態(tài)生成的元素綁定事件的方法
這篇文章主要介紹了AngularJS實現給動態(tài)生成的元素綁定事件的方法,結合實例形式分析了AngularJS動態(tài)生成元素與事件綁定相關操作技巧,需要的朋友可以參考下2016-12-12
Angular4學習之Angular CLI的安裝與使用教程
網上很多教程過時,命令在angular4中不適用等等,所以下面這篇文章主要給大家介紹了關于Angular4學習之Angular CLI的安裝與使用教程的相關資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。2018-01-01

