首頁  >  文章  >  web前端  >  Angular路由復用實作策略

Angular路由復用實作策略

小云云
小云云原創
2018-01-27 14:23:431451瀏覽

本文主要介紹了淺談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體驗上的問題。

相關推薦:

angular2路由預載實例詳解

以上是Angular路由復用實作策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn