最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Angular路由復(fù)用策略

 更新時(shí)間:2017年10月04日 09:08:28   作者:cipchk  
本篇文章主要介紹了淺談Angular路由復(fù)用策略,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

一、引言

路由在執(zhí)行過程中對組件無狀態(tài)操作,即路由離退時(shí)組件狀態(tài)也一并被刪除;當(dāng)然在絕大多數(shù)場景下這是合理的。

但有時(shí)一些特殊需求會(huì)讓人半死亡狀態(tài),當(dāng)然這一切都是為了用戶體驗(yàn);一種非常常見場景,在移動(dòng)端中用戶通過關(guān)鍵詞搜索商品,而死不死的這樣的列表通常都會(huì)是自動(dòng)下一頁動(dòng)作,此時(shí)用戶好不容易滾動(dòng)到第二頁并找到想要看的商品時(shí),路由至商品詳情頁,然后一個(gè)后退……用戶懵逼了。

Angular路由與組件一開始就透過 RouterModule.forRoot 形成一種關(guān)系,當(dāng)路由命中時(shí)利用ComponentFactoryResolver 構(gòu)建組件,這是路由的本質(zhì)。

而每一個(gè)路由并不一定是一次性消費(fèi),Angular 利用 RouteReuseStrategy 貫穿路由狀態(tài)并決定構(gòu)建組件的方式;當(dāng)然默認(rèn)情況下(DefaultRouteReuseStrategy)像開頭說的,一切都不進(jìn)行任何處理。

RouteReuseStrategy 從2就已經(jīng)是實(shí)驗(yàn)性,當(dāng)前依然如此,這么久應(yīng)該是可信任。

二、RouteReuseStrategy

RouteReuseStrategy 我稱它為:路由復(fù)用策略;并不復(fù)雜,提供了幾種辦法通俗易懂的方法:

  • shouldDetach 是否允許復(fù)用路由
  • store 當(dāng)路由離開時(shí)會(huì)觸發(fā),存儲(chǔ)路由
  • shouldAttach 是否允許還原路由
  • retrieve 獲取存儲(chǔ)路由
  • shouldReuseRoute 進(jìn)入路由觸發(fā),是否同一路由時(shí)復(fù)用路由

這看起來就像是一個(gè)時(shí)間軸關(guān)系,用一種白話文像是這樣:把路由 /list 設(shè)置為允許復(fù)用(shouldDetach),然后將路由快照存在 store 當(dāng)中;當(dāng) shouldReuseRoute 成立時(shí)即:再次遇到 /list 路由后表示需要復(fù)用路由,先判斷 shouldAttach 是否允許還原,最后從 retrieve 拿到路由快照并構(gòu)建組件。

當(dāng)理解這一原理時(shí),假如我們拿開頭搜索列表返回的問題就變得非常容易解決。

三、一個(gè)示例

誠如上面說明的,只需要實(shí)現(xiàn) RouteReuseStrategy 接口即可自定義一個(gè)路由利用策略。

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;
  }
}

定義一個(gè) _cacheRouters 用于緩存數(shù)據(jù)(路由快照及當(dāng)前組件實(shí)例對象)。

  • shouldDetach 直接返回 true 表示對所有路由允許復(fù)用
  • store 當(dāng)路由離開時(shí)會(huì)觸發(fā)。按path作為key存儲(chǔ)路由快照&組件當(dāng)前實(shí)例對象;path等同RouterModule.forRoot中的配置。
  • shouldAttach 若 path 在緩存中有的都認(rèn)為允許還原路由
  • retrieve 從緩存中獲取快照,若無則返回null
  • shouldReuseRoute 進(jìn)入路由觸發(fā),判斷是否同一路由

2、注冊

最后將策略注冊到模塊當(dāng)中:

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

假設(shè)我們有這么一個(gè)路由配置:

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

搜索組件用于搜索動(dòng)作,并在根據(jù)搜索結(jié)果跳轉(zhuǎn)至編輯頁,保存后又回到最后搜索結(jié)果的狀態(tài)(這部分代碼我就不貼有興趣見 plnkr)。

四、結(jié)論

上述只是一個(gè)簡單的拋磚引玉作用,實(shí)則對于復(fù)用的判斷會(huì)更復(fù)雜、滾動(dòng)條位置、緩存清理等等。

善用這種路由復(fù)用策略機(jī)制可以解決很多Web體驗(yàn)上的問題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • AngularJS實(shí)現(xiàn)給動(dòng)態(tài)生成的元素綁定事件的方法

    AngularJS實(shí)現(xiàn)給動(dòng)態(tài)生成的元素綁定事件的方法

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)給動(dòng)態(tài)生成的元素綁定事件的方法,結(jié)合實(shí)例形式分析了AngularJS動(dòng)態(tài)生成元素與事件綁定相關(guān)操作技巧,需要的朋友可以參考下
    2016-12-12
  • Angular6新特性之Angular Material

    Angular6新特性之Angular Material

    今天小編就為大家分享一篇關(guān)于Angular6新特性之Angular Material,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • angularjs項(xiàng)目的頁面跳轉(zhuǎn)如何實(shí)現(xiàn)(5種方法)

    angularjs項(xiàng)目的頁面跳轉(zhuǎn)如何實(shí)現(xiàn)(5種方法)

    本篇文章主要介紹了詳解angularjs項(xiàng)目的頁面跳轉(zhuǎn)如何實(shí)現(xiàn) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • angularjs中ng-bind-html的用法總結(jié)

    angularjs中ng-bind-html的用法總結(jié)

    這篇文章主要介紹了angularjs中ng-bind-html的用法總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • AngularJS 中括號的作用詳解

    AngularJS 中括號的作用詳解

    這篇文章主要介紹了AngularJS 中括號的作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 詳解Angular的8個(gè)主要構(gòu)造塊

    詳解Angular的8個(gè)主要構(gòu)造塊

    Angular 主要分為八大構(gòu)造塊(也就是八個(gè)核心概念):模塊、組件、模板、元數(shù)據(jù)、數(shù)據(jù)綁定、指令、服務(wù)、依賴注入。有興趣的可以了解一下
    2017-06-06
  • 基于Angularjs實(shí)現(xiàn)分頁功能

    基于Angularjs實(shí)現(xiàn)分頁功能

    這篇文章主要介紹了基于Angularjs實(shí)現(xiàn)分頁功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • AngularJS控制器詳解及示例代碼

    AngularJS控制器詳解及示例代碼

    本文主要介紹AngularJS控制器,這里整理了控制器的相關(guān)資料和提供示例代碼及實(shí)例效果圖,有需要的小伙伴可以參考下
    2016-08-08
  • 前后端如何實(shí)現(xiàn)登錄token攔截校驗(yàn)詳解

    前后端如何實(shí)現(xiàn)登錄token攔截校驗(yàn)詳解

    這篇文章主要給大家介紹了關(guān)于前后端如何實(shí)現(xiàn)登錄token攔截校驗(yàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Angular4學(xué)習(xí)之Angular CLI的安裝與使用教程

    Angular4學(xué)習(xí)之Angular CLI的安裝與使用教程

    網(wǎng)上很多教程過時(shí),命令在angular4中不適用等等,所以下面這篇文章主要給大家介紹了關(guān)于Angular4學(xué)習(xí)之Angular CLI的安裝與使用教程的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評論

祁门县| 吐鲁番市| 察隅县| 浦城县| 庄浪县| 黑河市| 聂荣县| 历史| 瓮安县| 玛多县| 三都| 赫章县| 奉节县| 枞阳县| 隆德县| 定边县| 宜昌市| 上犹县| 富裕县| 内丘县| 本溪| 曲靖市| 乌拉特后旗| 吴川市| 启东市| 东明县| 九寨沟县| 绥化市| 苍溪县| 邯郸市| 安远县| 顺义区| 奉贤区| 新蔡县| 连山| 平昌县| 田东县| 越西县| 黔南| 壶关县| 甘肃省|