Angular6路由复用策略解读
本文除了介绍路由复用策略外,还实现了父子路由如何复用的问题,项目见末尾;
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路由复用策略解读相关推荐
- NG RouteReuseStrategy(路由复用策略)
路由: 路由在执行过程中对组件无状态操作,即路由离退时组件状态也一并被删除: 路由的本质: Angular路由与组件一开始就透过 RouterModule.forRoot 形成一种关系,当路由命中时利 ...
- angular 路由复用策略
最近在弄单页面组件刷新功能的时候,接触到路由复用策略,总结下: 用法: 新建路由复用文件 SimpleReuseStrategy.ts: import { RouteReuseStrategy, De ...
- Angular路由复用策略出现Cannot reattach ActivatedRouteSnapshot created from a different route错误
复用代码 自己写的angular路由复用,用着基本挺好. 定义的的顺序就是复用的逻辑,离开某路由页面时,shouldDetach觉得可复用后,store去保存路由,再次进入页面时,shouldAtta ...
- Ant Design Blazor 组件库的路由复用多标签页介绍
前言 Blazor 是 .NET 最新的前端框架,可以基于 WebAssembly 或 SignalR (WebSocket)构建前端应用程序,基于 WebAssembly 托管模型的 Blazor ...
- 计算机网络最佳路由,优化计算机网络路由的策略
优化计算机网络路由的策略 计算机网络技术的广泛应用为网络路由的发展带来新的机遇与挑战,对提高网络资源的应用效率具有重要意 (本文共2页) 阅读全文>> 随着移动互联网技术和多媒体应用的快速 ...
- Asp.Net Core EndPoint 终结点路由工作原理解读
Asp.Net Core EndPoint 终点路由工作原理解读 一.背景 在本打算写一篇关于Identityserver4 的文章时候,却发现自己对EndPoint -终结点路由还不是很了解,故暂时 ...
- NetScreen下“区域”与“路由”、“策略”基本概念
NetScreen下"区域"与"路由"."策略"基本概念 "区域"这个概念是NetScreen自己定的,它是很多NetS ...
- router-view添加key解决同一路由复用相同组件
router-view添加key解决同一路由复用相同组件,比如/page/1.page/2就会复用组件,不执行钩子函数 <router-view :key="$route.fullPa ...
- 鸿蒙策略股票交易系统,股票交易策略有哪些?5种不同的交易策略解读
在股票市场中,不同时期的股票行情应当使用不同的股票交易策略应对.那么股票交易策略有哪些?哪些策略能够轻松坐车股市顺风车?看看下文5种不同的股票交易策略解读. 股票交易策略有哪些 每一种股票交易策略都有 ...
最新文章
- mysql 批处理文件传参_如何实现批处理文件传参数给SQLPLUS
- 网页实时聊天之PHP如何实现websocket
- python从入门到精通书-清华大学出版社-图书详情-《Python从入门到精通》
- 灰度图片维度与彩色图片维度-python-scikit-image包
- 个性化联邦学习算法框架发布,赋能AI药物研发
- Redis 快速入门 -- Redis 命令(6)
- 手把手0基础项目实战(三)——教你开发一套电商平台的安全框架
- 利用JDK发布webService实例
- 化工原理 --- 流体流体 --- 习题课及复习
- 上面两点下面一个三角形_K线图中走出三角形收敛形态必有大波动?一招判断后期走势方向...
- 方法重载和重写的区别,以及如何体现了多态性
- ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once.
- HTML制作宣传片,怎么制作视频宣传片 视频宣传片制作软件 照片制作成宣传视频,并添加相关文字说明...
- 通俗理解torch.distributed.barrier()工作原理
- Invalid MEX-file 'C:\Users\zs\Desktop\CSR-DCF\mex\mex_extractforeground.mexw64': 找不到指定模块
- 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配
- 如何用java打印1-100_在java中使用10个线程打印1到100
- 从企业微信、钉钉、班聊、纷享逍客,看企业服务
- 抖音点亮蓝v多少钱?有啥好处-万顿思电商
- BMap 设置地图类型、缩放平移控件及缩放级别
热门文章
- 动态壁纸安卓_兼容所有安卓手机,MIUI12的超级壁纸独立安装教程来了
- v-chart大小无法控制
- 基于STM32F103单片机的指南针电子罗盘方位显示原理图PCB程序设计
- 灰色关联分析法(GRA)-C++实现
- 圣斗士星矢限制服务器注册,圣斗士星矢服务器内BUG公告介绍
- MSBuild 常用参数
- python爬取知乎文章_Python爬取知乎日报,推送到kindle
- 基于Gabor滤波器的指纹图像增强处理算法matlab仿真
- 两种方法转换U盘格式
- TWAIN扫描识别工具v16.2正式发布,添加了新的API