首頁  >  文章  >  web前端  >  Angular路由復用策略的方法

Angular路由復用策略的方法

一个新手
一个新手原創
2017-10-24 11:04:171710瀏覽

一、引言

路由在執行過程中對元件無狀態操作,即路由離退時元件狀態也一併刪除;當然在絕大多數場景下這是合理的。

但有時一些特殊需求會讓人半死亡狀態,當然這一切都是為了用戶體驗;一種非常常見場景,在行動端中用戶透過關鍵字搜尋商品,而死不死的這樣的列表通常都會是自動下一頁動作,此時用戶好不容易滾動到第二頁並找到想要看的商品時,路由至商品詳情頁,然後一個後退……用戶懵逼了。

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中的配置。

  • shouldAttachpath 在快取中有的都認為允許還原路由

  • retrieve 從快取中取得快照,若無則傳回null

  • #shouldReuseRoute 進入路由觸發,判斷是否相同路由

#2、註冊

最後將策略註冊到模組當中:

providers: [
  { provide: RouteReuseStrategy, useClass: SimpleReuseStrategy }
]

假設我們有這麼一個路由配置:

RouterModule.forRoot([
  { path: 'search', component: SearchComponent },
  { path: 'edit/:id', component: EditComponent }
])

搜尋元件用於搜尋動作,並在根據搜尋結果跳轉至編輯頁,儲存後又回到最後搜尋結果的狀態(這部分程式碼我就不貼有興趣見plnkr)。

四、結論

上述只是一個簡單的拋磚引玉作用,實則對於復用的判斷會更複雜、滾動條位置、緩存清理等等。

善用這種路由復用策略機制可以解決很多Web體驗上的問題。


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

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