此文章转载自同事的wiki,因为觉得对结合理解栈和视图很有帮助,就分享给更多的朋友,如果有错误的地方,欢迎指出!

在看ionicview视图的生命周期前面,我希望大家可以先了解一下栈这个概念。我所能理解的栈,即一种先进后出的模式。这个时候我们把栈和视图联系起来,就可以很好的理解。

一、页面跳转

  • A->B->C->D

你首先进入A页面,这个时候A页面处于栈顶的位置,然后这个时候从A页面跳到B页面,B页面进栈,B页面就处在栈顶,同理C页面和D页面都一样。最后的结果是栈顶为D页面,其次为C、B、A。

  • A->B->C->D->A

首先A->B->C->D和上面一样,这个时候你要从D页面去A页面,这里就要分为2种方式来区分:

方式1,使用跳转的方式:比如说常用的$state.go和$location.path,这里我拿$state.go来介绍。当你使用$state.go进入A页面,首先会先在栈中查找A页面:

  • 如果A页面已经在栈中存在了,它就会从栈中帮A页面取出来移到栈顶,这个时候栈的顺序就为栈顶为A页面,其次为D、C、B;
  • 如果A页面在栈中不存在的话,这个时候A页面是一个新的页面,它就会进栈,成为栈顶。

方式2,使用返回的方式:我们经常用的history.goback(),返回到上一页,其实它是在执行这么一个过程:history.goback(-1),让当前页面出栈,移出这个栈,让上一个页面成为栈顶。这里的-1就是返回到上一个页面,同理-2就代表着返回到上上个页面,你从D页面去A页面的话要是采用history.goback(),那么其实你是在执行:首先D页面出栈,C页面成为栈顶,然后C页面出栈,B页面变为栈顶,最后B页面出栈,返回到A页面,A页面成为栈顶,此时的栈中也就只有A了。那么history.goback()里面的参数,就是你要返回页面的下标与当前页面的下标差值。

那么这里的下标什么意思呢? 
所谓下标,我们经常在数组中听到,那么其实这个栈我们也可以理解为一个存放页面视图的数组,

ionic中是这样表示的:

  • var historyId = $ionicHistory.currentHistoryId(); 
    这里的historyId 代表是属于哪个栈里面的,根据historyId 来标识栈。 
    因为这里存在2个标识: 
    1,单独登录页面栈 
    2,除登陆页面以外的所有页面的栈
  • var history = $ionicHistory.viewHistory().histories[historyId]; 
    这里的history 代表是根据historyId 来找到history 历史记录
  • history.stack 数组 
    这里的history.stack代表history 的栈,它是一个数组

至此我们已经得到了history.stack数组,接着我们根据history.stack[i].stateName和页面路由配置里的name相比较,很容易就得到页面在数组里面的下标,至此即可返回到A页面。

二、在页面跳转的同时,我们不可避免的要与缓存打交道,缓存不能说好,也不能说不好,关键在于我们怎么利用。我们可以做到什么时候想让一个页面有缓存,什么时候让一个页面没有缓存,那么怎么能做到这样呢?

这个时候我们拿上面例子,方式1中A页面已存在来说:(PS:默认所有页面都是缓存数据的)

当你从D页面跳到A页面,这个时候你在A页面再跳到B页面,同理A页面的跳转,这个时候B页面移到栈顶,此时栈的顺序为B、A、D、C,这个时候B页面存在缓存数据,但是按照正常的逻辑,B页面在从A页面跳过来的时候是不想要缓存数据的,那么如何解决处理B页面的缓存数据呢?可能你会说设置B页面的路由为cache=false即可不缓存数据,这样是可以,但是如果我要是正常A->B->C->D 从C页面返回B页面是想要缓存数据的,由于设置了cache=false,就不会有缓存数据了,这就不符合业务逻辑啦。所以在你从D页面回A页面的时候不要采用方式1,而是采用方式2,那么就可以完成D->A->B,B页面不存在缓存数据。

由此可得,如果你要想实现从一个页面跳到一个已经存在的页面,比如 A->B->C->D->A 你想回到A,而不想缓存B或C、D页面,那么你就使用方式2,其它情况可以使用方式1。

三、页面跳转,离不开页面,谈到页面我们就需要谈一谈视图的生命周期(PS:这里我同原生activity进行比较,毕竟有比较才会有收获)

ionic view   android activity
loaded < ——对应——> onCreate (创建)
beforeEnter    
enter < ——对应——> onStart (用户看见了界面)
afterEnter < ——对应——> onResume(用户得到了界面焦点)
beforeLeave < ——对应——> onPause (用户失去了界面焦点)
leave < ——对应——> onStop (用户看不见了界面)
afterLeave    
unloaded < ——对应——> onDestroy (销毁)
    onRestart (再一次回到这个界面)

如果你进入一个栈中不存在的页面,比如A->B->C,这个时候你进入D页面, 
D页面:loaded->beforeEnter->enter->afterEnter, 这个时候代表着D页面已经完全展现在用户面前;即D进入栈中,D处于栈顶

假设1:我们这个时候从D页面返回到C页面, 
D页面:beforeLeave->leave->afterLeave->unloaded, 这个时候代表着D页面已经消失在用户面前;即D已经离开栈

假设2:我们这个时候从D页面跳到新的界面E, 
D页面:beforeLeave->leave->afterLeave, 这个时候代表着D页面只是暂时消失在用户面前;即D不处于栈顶,但还在栈内

假设3:我们这个时候从界面E返回界面D, 
D页面:beforeEnter->enter->afterEnter, 这个时候代表着D页面又出现在用户面前;即D又处于栈顶

假设4:如果这个时候在D页面按手机的返回键退出程序,生命周期执行同假设1

假设5:如果这个时候在D页面直接按手机的home键,生命周期执行beforeLeave->leave->afterLeave,然后我们再点击app,直接出现D页面,生命周期执行beforeEnter->enter->afterEnter

比较假设1,2,3,4,5;我们可以得出,loaded和unloaded在D页面的生命周期内只执行一次,即第一次进栈和离开栈的时候,如果页面还在栈内,就是围绕着beforeLeave->leave->afterLeave和beforeEnter->enter->afterEnter这几个来进行生命周期。

转载于:https://www.cnblogs.com/richard-wzh/p/5960512.html

ionicView视图的生命周期相关推荐

  1. iOS10 UI教程视图的生命周期

    iOS10 UI教程视图的生命周期 说到视图的生命周期一般都是指视图控制器的视图生命周期.在视图的声明周期中最主要的有8个方法,分别为loadView().viewDidLoad().viewWill ...

  2. iOS开发-ViewController的生命周期和切换

    ViewController在App开发中是至关重要的一环,无论是页面的展示和数据之间的交互,ViewController提供了一个框架可以管理和构建App应用.iOS中构建App提供了两种方式一种是 ...

  3. 让Flows感知生命周期

    点击上方蓝字关注我,知识会给你力量 这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程.Flow.LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问 ...

  4. vue3生命周期钩子函数

    vue2生命周期钩子函数视图 vue3生命周期钩子函数视图 代码 // 通过配置项 beforeCreate () { console.log('beforeCreate'); }, created ...

  5. ionic中关于ionicView 的生命周期

    前言 当我们来回切换页面时候,视图被缓存下来,不用每次再去new一个新的视图,可以大大地提高性能.当跳出一个视图后,视图的元素被保存在DOM中,它的作用域也就不在$watch的作用域内,当我们访问一个 ...

  6. 【转】【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...

    原文网址:http://blog.csdn.net/weasleyqi/article/details/8090373 iOS视图控制对象生命周期-init.viewDidLoad.viewWillA ...

  7. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、v...

    2019独角兽企业重金招聘Python工程师标准>>> iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.vie ...

  8. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view...

    iOS视图控制对象生命周期: init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用 ...

  9. iOS7应用开发5、视图控制器View Controller及其生命周期

    1.UITextView: 该类与Label类类似,可显示多行,可以编辑内容,可以滚动查看内容: 包含属性NSTextStorage *textStorage,该类是NSMutableAttribut ...

  10. _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途...

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

最新文章

  1. Android中Activity共享变量的另一方法:Application context
  2. 使用ISAPI_Rewrite做实用的重定向
  3. 用于HTTP加密浏览的TW2.0插件
  4. 2015年3月-前端开发月刊
  5. python消息队列celery高可用_分布式消息队列-Celery
  6. 传智播客java测试题_传智播客Java基础综合测试题
  7. thymeleaf模板引擎shiro集成框架
  8. PC版-B站下载视频
  9. linux 关闭本地防火墙_如何使用Linux防火墙阻止本地欺骗地址
  10. 数据科学入门与实战:玩转pandas之六时间序列
  11. J2EE常用Listener(转载)
  12. Eigen教程(3)之矩阵和向量的运算
  13. MySQL基础实战篇
  14. c语言程序设计黄保和第二章,c语言程序设计答案(选择题+编程)黄保和、江戈版...
  15. 不花钱也能使用迅雷的高速通…
  16. 【VC7升级VC8】将vCenter Server 7.X 升级为 vCenter Server 8 (上)—— VC 8系统要求与升级前的说明
  17. 电子凸轮应用追剪算法详细图解(附PLC完整源代码)
  18. 网络安全-MS17-010漏洞-永恒之蓝
  19. Python 语言中的骚操作
  20. 这可能是全球发展最快的移动互联网公司

热门文章

  1. python 判断点在随机多边形内_Python确定散点是否在多边形内,python,判断,内部
  2. ef codefirst字段类型与sqlserver表字段类型对应概要
  3. linux实验十shell程序设计,实验二Linux Shell编程.doc
  4. PHP 动态设置数组索引的值
  5. Java引用常量得好处_JAVA常量池的作用
  6. 闹钟流程_自考专升本1月份统考粤康码申报流程
  7. 六石管理学:使用排除法解决问题
  8. 支持x86/aarch/mips/loongarch的jogamp-2.3.2源码开源
  9. configure: error: cups-config not found
  10. 硬盘出错,导致文件坏了