摘要:一個路由復(fù)用策略用例下面貼一個路由復(fù)用策略用例,應(yīng)該是滿足大部分人的業(yè)務(wù)要求,注意事項只能是末級路由的緩存,且路由切換的時候路由節(jié)點上的不能超過兩個。
關(guān)于路由復(fù)用策略網(wǎng)上的文章很多,大多是講如何實現(xiàn)tab標(biāo)簽切換歷史數(shù)據(jù),至于如何復(fù)用的原理講的都比較朦朧,代碼樣例也很難適用各種各樣的路由配置,比如懶加載模式下多級嵌套路由出口網(wǎng)上的大部分代碼都會報錯。對路由復(fù)用策略的理解
我希望能通過這篇文章把如何復(fù)用路由的原理講明白,讓小伙伴能明明白白的實用路由復(fù)用策略,文字中有不詳實和錯誤的地方歡迎小伙伴批評指正
路由復(fù)用策略的是對路由的父級相同節(jié)點的組件實例的復(fù)用,我們平時看到的多級嵌套路由切換時上層路由出口的實例并不會從新實例化就是因為angular默認(rèn)的路由復(fù)用策略在起作用,而我們從寫路由復(fù)用策略能實現(xiàn)很多事情,其中之一就是實現(xiàn)
歷史路由狀態(tài)(數(shù)據(jù))的存儲,即jquery時代的tab頁簽和iframe實現(xiàn)操作歷史的切換。
我一開始認(rèn)為路由復(fù)用策略就是對歷史路由數(shù)據(jù)的復(fù)用策略,這個錯誤的觀念導(dǎo)致我對路由復(fù)用策略接口方法理解起來異常困難,不知小伙伴和我犯沒犯同樣的錯誤。觀念正確了,下面就理解起來比較方便了,寫路由復(fù)用策略也就比較順手了。
下面是angular默認(rèn)路由復(fù)用策略,每切換一下路由,下面代碼都再默默的執(zhí)行。
export class DefaultRouteReuseStrategy { shouldDetach(route) { return false; } store(route, detachedTree) { } shouldAttach(route) { return false; } retrieve(route) { return null; } shouldReuseRoute(future, curr) { return future.routeConfig === curr.routeConfig; } }關(guān)鍵概念解釋
開始文章前我們先了解幾個觀念概念
我們的路由是棵樹,RouterModule.forRoot(Routes),RouterModule.forChild(Routes)這些配置最后形成一個完整的路由樹,路由樹有個根是沒有routeConfig的,routeConfig是我們寫的每個route。
路由節(jié)點,一個路徑是由幾個路由節(jié)點組成,有的route配置了component,有的則沒有
future下一路由, curr當(dāng)前路由,切換路由時,我們在下文用future表示下一路由,curr表示當(dāng)前路由
路由復(fù)用策略解析 路由復(fù)用策略方法調(diào)用順序shouldReuseRoute(future, curr)
retrieve(route)
shouldDetach(route)
store(route, detachedTree)
shouldAttach(route)
retrieve,取決一上一步的返回值
store(route, detachedTree),取決第五步
shouldReuseRouteshouldReuseRoute()決定是否復(fù)用路由,根據(jù)切換的future curr的節(jié)點層級依次調(diào)用,返回值為true時表示當(dāng)前節(jié)點層級路由復(fù)用,然后繼續(xù)下一路由節(jié)點調(diào)用,入?yún)榍袚Q的下一級路由(子級)的future curr路由的節(jié)點,返回值為false時表示不在復(fù)用路由,并且不再繼續(xù)調(diào)用此方法(future路由不再復(fù)用,其子級路由也不會復(fù)用,所以不需要再詢問下去),root路由節(jié)點調(diào)用一次,非root路由節(jié)點調(diào)用兩次這個方法,第一次比較父級節(jié)點,第二次比較當(dāng)前節(jié)點,
retrieveretrieve()接上一步奏,當(dāng)當(dāng)前層級路由不需要復(fù)用的時候,調(diào)用一下retrieve方法,其子級路由也會調(diào)用一下retrieve方法,如果返回的是null,那么當(dāng)前路由對應(yīng)的組件會實例化,這種行為一直持續(xù)到末級路由。
shouldDetachshouldDetach是對上一路由的數(shù)據(jù)是否實現(xiàn)拆離,其調(diào)用開始是當(dāng)前層級路由不需要復(fù)用的時候,即shouldReuseRoute()返回false的時候,如果這時候反回false,將繼續(xù)到上一路由的下一層級調(diào)用shouldDetach,直到返回true或者是最末級路由后才結(jié)束對shouldDetach的調(diào)用,當(dāng)返回true時就調(diào)用一次store 方法,請看下一步奏
storestore存儲路分離出來的上一路由的數(shù)據(jù),當(dāng) shouldDetach返回true時調(diào)用一次,存儲應(yīng)該被分離的那一層的路由的DetachedRouteHandle。注意:無論路由樹上多個含有組件component路由節(jié)點,能分離出來的只能有一個,被存儲的也只能有一個,感覺這種機制對使用場景有很大限制。
shouldAttachshouldAttach是對當(dāng)前路由的數(shù)據(jù)是否實現(xiàn)恢復(fù)(附加回來),其調(diào)用開始是當(dāng)前層級路由不需要復(fù)用的時候,即shouldReuseRoute()返回false的時候,這和shouldDetach的調(diào)用時機很像,但是,并不是所有的路由層級都是有組件實例的,只有包含component的route才會觸發(fā)shouldAttach,如果反回false,將繼續(xù)到當(dāng)前路由的下一帶有component的路由層級調(diào)用shouldAttach,直到返回true或者是最末級路由后才結(jié)束對shouldAttach
的調(diào)用,當(dāng)返回true時就調(diào)用一次retrieve 方法,如果retrieve方法去獲取一下當(dāng)前路由的DetachedRouteHandle,返回一個DetachedRouteHandle,就再調(diào)用一次store,再保存一下retrieve返回的DetachedRouteHandle。注意注意:無論路由樹上多個含有組件component路由節(jié)點,能恢復(fù)數(shù)據(jù)的只能有一個節(jié)點,這和shouldDetach是一個套路,對使用場景有很大限制。
路由復(fù)用策略這種調(diào)用機制對使用場景限制很大 ,比如多級路由出口嵌套就無法實現(xiàn)路由數(shù)據(jù)緩存。因為多級路由出口嵌套的應(yīng)用切換路由時,前后路由會包含多個帶component的路由節(jié)點,而每次對路由的存儲和恢復(fù)只能存儲和恢復(fù)某一個節(jié)點的component的DetachedRouteHandle,其他路由節(jié)點上的component就是被從新實例化。明白這一點后我就放棄了想寫一個可以適用任何場景的路由復(fù)用策略的想法,如果有小伙伴能解決好這一業(yè)務(wù)場景,歡迎賜教。
如果這個路由復(fù)用策略可以存儲一個路由上多個節(jié)點的DetachedRouteHandle,和恢復(fù)多個節(jié)點的DetachedRouteHandle,應(yīng)該能解決上面是的多級路由出口嵌套場景,但不知道會不會帶來別的問題。
一個路由復(fù)用策略用例下面貼一個路由復(fù)用策略用例,應(yīng)該是滿足大部分人的業(yè)務(wù)要求,注意事項:只能是末級路由的緩存,且路由切換的時候路由節(jié)點上的component不能超過兩個。
import {ActivatedRouteSnapshot, DetachedRouteHandle, Route, RouteReuseStrategy} from "@angular/router"; export class CustomerReuseStrategy implements RouteReuseStrategy { static handlers: Map= new Map(); shouldDetach(route: ActivatedRouteSnapshot): boolean { return !route.firstChild; } shouldAttach(route: ActivatedRouteSnapshot): boolean { return !!CustomerReuseStrategy.handlers.has(route.routeConfig); } shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot) { return curr.routeConfig === future.routeConfig; } retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle { if (!!route.firstChild) { return null; } return CustomerReuseStrategy.handlers.get(route.routeConfig); } store(route: ActivatedRouteSnapshot, handle: DetachedRouteHandle): void { CustomerReuseStrategy.handlers.set(route.routeConfig, handle); } }
很精簡,但是很好用,小伙伴可以根據(jù)自己的業(yè)務(wù)邏輯進行改造。
如果感覺這篇文章對你有幫助,請點個贊吧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100362.html
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:的特性和性能是的超集,用于幫助的開發(fā)。注解提供了連接元數(shù)據(jù)和功能的工具。通過在庫中提供基本信息可以調(diào)用函數(shù)或創(chuàng)建類的實例來檢查相關(guān)元數(shù)據(jù),從而簡化了對象實例的構(gòu)建。停用它會響應(yīng)跳出舊控制器的成功事件。 showImg(https://segmentfault.com/img/bVSqTU?w=850&h=460); 在Web應(yīng)用開發(fā)領(lǐng)域,Angular被認(rèn)為是最好的開源JavaScri...
摘要:一個高度可復(fù)用的組件則可以被稱為控件,是可以單獨投稿項目庫的。行為的定制化通過參數(shù)綁定實現(xiàn)組件行為的定制化。組件被銷毀時調(diào)用。當(dāng)有組件復(fù)用的情況時請使用標(biāo)識指定接收對象模型另外最好給事件名添加組件前綴。 轉(zhuǎn)自自己在開源中國的博客:https://my.oschina.net/u/7247... angular 1 也要面向組件編程 前端組件化是前端開發(fā)模式中一個不可逆轉(zhuǎn)的趨勢,三大主要...
閱讀 1219·2021-11-22 12:05
閱讀 1344·2021-09-29 09:35
閱讀 641·2019-08-30 15:55
閱讀 3135·2019-08-30 14:12
閱讀 962·2019-08-30 14:11
閱讀 2882·2019-08-30 13:10
閱讀 2411·2019-08-29 16:33
閱讀 3338·2019-08-29 11:02