本文除了介绍路由复用策略外,还实现了父子路由如何复用的问题,项目见末尾;

1、父路由和子路由页面的tab不应该同时存在,否则,切换时容易报以下错误:

Cannot reattach ActivatedRouteSnapshot with a different number of children

2、子路由实例化时可以根据路由缓存同时恢复其对应的父路由;具体详见项目中的路由复用策略;

路由导航过程:创建新的路由节点;激活路由节点(停用旧路由、激活新路由);

路由复用策略各方法执行流程如下:

其中,可以看到一个路由复用过程中,可能会出现俩次retrieve操作。这是因为第一次调用是为了获取缓存路由对应的快照对象TreeNode,第二次调用是为了获取缓存对应的组件实例化对象ComponentRef

路由复用详细解析:

创建新的路由节点:

初始化节点时,通过shouldReuseRoute判断未来路由是否与当前路由相同,若相同,则赋当前路由页面快照到新创建节点的初始值;否则,判断是否存在已有缓存,若有,则通过retrieve同样赋快照初始值,否则,则默认初始化节点;

function createNode(routeReuseStrategy: RouteReuseStrategy, curr: TreeNode<ActivatedRouteSnapshot>,prevState?: TreeNode<ActivatedRoute>): TreeNode<ActivatedRoute> {// reuse an activated route that is currently displayed on the screenif (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) {const value = prevState.value;value._futureSnapshot = curr.value;const children = createOrReuseChildren(routeReuseStrategy, curr, prevState);return new TreeNode<ActivatedRoute>(value, children);// retrieve an activated route that is used to be displayed, but is not currently displayed} else {const detachedRouteHandle =<DetachedRouteHandleInternal>routeReuseStrategy.retrieve(curr.value);if (detachedRouteHandle) {const tree: TreeNode<ActivatedRoute> = detachedRouteHandle.route;setFutureSnapshotsOfActivatedRoutes(curr, tree);return tree;} else {const value = createActivatedRoute(curr.value);const children = curr.children.map(c => createNode(routeReuseStrategy, c));return new TreeNode<ActivatedRoute>(value, children);}}
}

停用旧路由:

停用路由及其子路由:判断该路由是否要保存shouldDetach,若要,则保存store该路由;

private deactivateRouteAndItsChildren(route: TreeNode<ActivatedRoute>, parentContexts: ChildrenOutletContexts): void {if (this.routeReuseStrategy.shouldDetach(route.value.snapshot)) {this.detachAndStoreRouteSubtree(route, parentContexts);} else {this.deactivateRouteAndOutlet(route, parentContexts);}}private detachAndStoreRouteSubtree(route: TreeNode<ActivatedRoute>, parentContexts: ChildrenOutletContexts): void {const context = parentContexts.getContext(route.value.outlet);if (context && context.outlet) {const componentRef = context.outlet.detach();const contexts = context.children.onOutletDeactivated();this.routeReuseStrategy.store(route.value.snapshot, {componentRef, route, contexts});}}

激活新路由:

激活未来路由时,判断是否可以取缓存路由(shouldAttach),若可以,则retrieve获取缓存路由,且通过store置空缓存对象;

if (this.routeReuseStrategy.shouldAttach(future.snapshot)) {const stored =(<DetachedRouteHandleInternal>this.routeReuseStrategy.retrieve(future.snapshot));this.routeReuseStrategy.store(future.snapshot, null);context.children.onOutletReAttached(stored.contexts);context.attachRef = stored.componentRef;context.route = stored.route.value;if (context.outlet) {// Attach right away when the outlet has already been instantiated// Otherwise attach from `RouterOutlet.ngOnInit` when it is instantiatedcontext.outlet.attach(stored.componentRef, stored.route.value);}advanceActivatedRouteNodeAndItsChildren(stored.route);}

具体路由复用策略的实现,可参考本人git上发布的实例项目:

https://github.com/007katoo/Ng6-Manage

参考文章:

1、兜兜转转的小菊——angular 路由复用策略实现懒路由下多tab页切换;

2、NG-ZORRO

3、及文章1里的所有引用文章;

Angular6路由复用策略解读相关推荐

  1. NG RouteReuseStrategy(路由复用策略)

    路由: 路由在执行过程中对组件无状态操作,即路由离退时组件状态也一并被删除: 路由的本质: Angular路由与组件一开始就透过 RouterModule.forRoot 形成一种关系,当路由命中时利 ...

  2. angular 路由复用策略

    最近在弄单页面组件刷新功能的时候,接触到路由复用策略,总结下: 用法: 新建路由复用文件 SimpleReuseStrategy.ts: import { RouteReuseStrategy, De ...

  3. Angular路由复用策略出现Cannot reattach ActivatedRouteSnapshot created from a different route错误

    复用代码 自己写的angular路由复用,用着基本挺好. 定义的的顺序就是复用的逻辑,离开某路由页面时,shouldDetach觉得可复用后,store去保存路由,再次进入页面时,shouldAtta ...

  4. Ant Design Blazor 组件库的路由复用多标签页介绍

    前言 Blazor 是 .NET 最新的前端框架,可以基于 WebAssembly 或 SignalR (WebSocket)构建前端应用程序,基于 WebAssembly 托管模型的 Blazor ...

  5. 计算机网络最佳路由,优化计算机网络路由的策略

    优化计算机网络路由的策略 计算机网络技术的广泛应用为网络路由的发展带来新的机遇与挑战,对提高网络资源的应用效率具有重要意 (本文共2页) 阅读全文>> 随着移动互联网技术和多媒体应用的快速 ...

  6. Asp.Net Core EndPoint 终结点路由工作原理解读

    Asp.Net Core EndPoint 终点路由工作原理解读 一.背景 在本打算写一篇关于Identityserver4 的文章时候,却发现自己对EndPoint -终结点路由还不是很了解,故暂时 ...

  7. NetScreen下“区域”与“路由”、“策略”基本概念

    NetScreen下"区域"与"路由"."策略"基本概念 "区域"这个概念是NetScreen自己定的,它是很多NetS ...

  8. router-view添加key解决同一路由复用相同组件

    router-view添加key解决同一路由复用相同组件,比如/page/1.page/2就会复用组件,不执行钩子函数 <router-view :key="$route.fullPa ...

  9. 鸿蒙策略股票交易系统,股票交易策略有哪些?5种不同的交易策略解读

    在股票市场中,不同时期的股票行情应当使用不同的股票交易策略应对.那么股票交易策略有哪些?哪些策略能够轻松坐车股市顺风车?看看下文5种不同的股票交易策略解读. 股票交易策略有哪些 每一种股票交易策略都有 ...

最新文章

  1. mysql 批处理文件传参_如何实现批处理文件传参数给SQLPLUS
  2. 网页实时聊天之PHP如何实现websocket
  3. python从入门到精通书-清华大学出版社-图书详情-《Python从入门到精通》
  4. 灰度图片维度与彩色图片维度-python-scikit-image包
  5. 个性化联邦学习算法框架发布,赋能AI药物研发
  6. Redis 快速入门 -- Redis 命令(6)
  7. 手把手0基础项目实战(三)——教你开发一套电商平台的安全框架
  8. 利用JDK发布webService实例
  9. 化工原理 --- 流体流体 --- 习题课及复习
  10. 上面两点下面一个三角形_K线图中走出三角形收敛形态必有大波动?一招判断后期走势方向...
  11. 方法重载和重写的区别,以及如何体现了多态性
  12. ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once.
  13. HTML制作宣传片,怎么制作视频宣传片 视频宣传片制作软件 照片制作成宣传视频,并添加相关文字说明...
  14. 通俗理解torch.distributed.barrier()工作原理
  15. Invalid MEX-file 'C:\Users\zs\Desktop\CSR-DCF\mex\mex_extractforeground.mexw64': 找不到指定模块
  16. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
  17. 如何用java打印1-100_在java中使用10个线程打印1到100
  18. 从企业微信、钉钉、班聊、纷享逍客,看企业服务
  19. 抖音点亮蓝v多少钱?有啥好处-万顿思电商
  20. BMap 设置地图类型、缩放平移控件及缩放级别

热门文章

  1. 动态壁纸安卓_兼容所有安卓手机,MIUI12的超级壁纸独立安装教程来了
  2. v-chart大小无法控制
  3. 基于STM32F103单片机的指南针电子罗盘方位显示原理图PCB程序设计
  4. 灰色关联分析法(GRA)-C++实现
  5. 圣斗士星矢限制服务器注册,圣斗士星矢服务器内BUG公告介绍
  6. MSBuild 常用参数
  7. python爬取知乎文章_Python爬取知乎日报,推送到kindle
  8. 基于Gabor滤波器的指纹图像增强处理算法matlab仿真
  9. 两种方法转换U盘格式
  10. TWAIN扫描识别工具v16.2正式发布,添加了新的API