组件生命周期

(1)组件生命周期钩子

constructor:组件创建时被创建

ngOnChanges: 父组件修改或初始化子组件的输入属性时被调用,如果子组件没有输入属性,则永远不会被调用,它的首次调用发生在ngOnInit之前

ngOnInit:用于初始化组件,因为ngOnChanges事件发生在constructor之后,所以构造函数无法获得输入属性,ngOnInit则能够取到输入属性,所以组件的初始化逻辑一定要依赖输入属性的值,则应该在ngOnInit中初始化而不是构造函数

ngDoCheck:Angular变更检测调用

ngAfterContentInit

ngAfterContentChecked

ngAfterViewInit

ngAfterViewChecked

(2)变ngOnChanges

可变对象、不可变对象

在js中,字符串是不可变对象,当一个字符串在内存中被创建后,它的值永远不会被改变。

如上图,第二行代码中的Hello World并不会改变Hello的值,而是重新创建出一个对象,

但是greeting的内存地址由第一个字符串指向了第二个字符串的地址。

而Object是可变对象,在修改Object的属性时,它的内存地址仍一直保持不变。

ngOnChanges钩子只有当输入属性的引用改变时才会被调用

如果输入属性是可变对象,其属性变化不会触发ngOnChanges钩子,但是会触发ngDoCheck钩子

(3)变更检测

变更检测依赖zone.js,用于处理组件属性的改变与模板的同步,浏览器中触发异步事件导致的方法调用会触发变更检测

比如:点击按钮、输入数据、数据从服务器返回,调用setTimeOut方法等等,

一个Angular应用是一个以主组件为根的组件树,每个组件都有其自己的变更检测器,

无论变更发生在哪个组件上,当变更发生时,会从组件树的根往下进行检测,

组件树上的变更检测器都会根据自己的变更检测策略(Default策略、OnPush策略)进行检测

变更检测会调用ngDoCheck钩子、ngAfterContentChecked钩子、ngAfterViewChecked钩子,

所以使用这些钩子时可能会出现性能问题

(4)AfterViewInit、AfterViewChecked

1、ngAfterViewInit、ngAfterViewChecked两个钩子会在视图组装完毕后被先后调用,

子组件会先调用这两个方法,然后父组件调用。ngAfterViewInit只会在视图组装完毕后被调用一次

ngAfterViewChecked会在ngAfterViewInit之后被调用一次,之后每发生变更检测会再被调用

2、在子组件中异步调用方法,触发变更检测,会先触发子组件的变更检测、再触发父组件的变更检测

3、在一个变更检测周期中,Angular禁止在一个视图被组装完毕之后再去更新视图,

所以不要在ngAfterViewInit和ngAfterViewChecked中更新视图中绑定的属性

然而ngAfterContentInit和ngAfterContentChecked触发时,组件尚未组装完毕,在这两个方法中可以修改模板中的绑定属性

变更检测是通过异步事件触发的,通过异步事件重新开启一个变更检测周期去改变绑定的属性不会报错

由于ngAfterViewInit只会执行一次,所以可以使用setTimeOut方法更改绑定的属性

但是在ngAfterViewChecked中使用此方法会造成无限循环

(5)运行时动态改变模板的内容又不使用路由,可以通过投影实现

通过在模板子组件标签中填充内容可以将内容投影到子组件中

通过select指定投影的内容

另一种在绑定动态html内容的方式,但是innerHtml只是浏览器中的特性,跨平台性不好

(6)ngAfterContentInit、ngAfterContentChecked

ngAfterContentInit、ngAfterContentChecked是投影相关的钩子

(7)ngOnDestroy

当从一个路由地址跳转到另一个路由地址时,前一个组件会被销毁,后一个组件会被创建

组件被销毁时会调用ngOnDestroy钩子,通常会在组件被销毁时反订阅一个流或者清除定时器等等

 

AngularJs学习笔记-组件生命周期的更多相关文章

  1. Angular 5.x 学习笔记(2) - 生命周期钩子 - 暂时搁浅

    Angular 5.x Lifecycle Hooks Learn Note Angular 5.x 生命周期钩子学习笔记 标签(空格分隔): Angular Note on cnblogs.com ...

  2. vue 学习一 组件生命周期

    先上一张vue组件生命周期的流程图 以上就是一个组件完整的生命周期,而在组件处于每个阶段时又会提供一些周期钩子函数以便我们进行一些逻辑操作,而总体来讲 vue的组件共有8个生命周期钩子 beforeC ...

  3. stenciljs 学习三 组件生命周期

    stenciljs 组件包含好多生命周期方法, will did load update unload 实现生命周期的方法比价简单类似 componentWillLoad ....,使用typescr ...

  4. Android学习笔记_18_Activity生命周期 及 跳转方式

    一.Activity有三个状态: 1.当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态.它就是响应用户操作的Activity. 2. 当它上面有另外一个Activity,使它失去了焦点但 ...

  5. Java Web学习笔记-Servle生命周期

    Servlet会在服务器启动或第一次请求该Servlet的时候开始生命周期,在服务器停止的时候结束生命周期. 无论请求多少次Servlet,最多只有一个Servlet实例.多个客户端并发请求Servl ...

  6. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

  7. iOS学习笔记—ViewController/生命周期

    ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁,ViewController管理应用中的众多视图.iOS的SDK中提供很多原生ViewController ...

  8. MVC学习笔记---MVC生命周期

    Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率.因此在2007年和2008年我在这个话题上各写了一篇文章 ...

  9. MVC学习笔记---MVC生命周期及管道

    ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...

随机推荐

  1. CDN working principle diagram

    转自 https://cloud.tencent.com/developer/article/1358553

  2. 解读人:刘佳维,Spectral Clustering Improves Label-Free Quantification of Low-Abundant Proteins(谱图聚类改善了低丰度蛋白的无标记定量)

    发表时间:(2019年4月) IF:3.95 单位: 维也纳医科大学: 欧洲生物信息研究所(EMBL-EBI): 分子病理学研究所: 奥地利科学院分子生物技术研究所: Gregor Mendel分子植 ...

  3. 小程序启用slot -- 传入 wxml标签

    options:{ multipleSlots:true } 直接看:https://www.jianshu.com/p/b22c9e075931

  4. git教程5-webhook

    运维需求 许多存储系统(如:MySQL)提供慢查询日志帮助开发与运维人员定位系统存在的慢操作.所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息(例如: ...

  5. 时间format函数引爆的知识点和年末有话说

    年末感慨 转眼之间,一年的最后一天来了. 2017,技术界貌似正在飞跃.多年的量变终于引起了质变. 人工智能,区块链.对此,我很激动,激动着有点害怕,害怕中有点紧张,还有点渴望.未来的至高点,未来的风 ...

  6. redis结合springboot 无法注入redisTemplate问题

    报错: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean o ...

  7. 忘记mysql数据库密码时进行修改方法

    长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件夹( ...

  8. Win10文件无法重命名

    适用版本:Win10 Lenovo ideapad 310s 方法一:禁用所有开机启动项,重启 方法二:进入安全模式测试 方法三:新建一个账户

  9. Seven-segment Display 贪心选择,快速判断能否有解

    https://csacademy.com/contest/round-39/task/seven-segment-display/ 可以知道,只有1是无解 而且肯定是选出来的位数约小越好. 位数 = ...

  10. UiAutomator编译与运行测试代码

    编译与运行步骤 1.创建build文件.打开cmd命令窗口,进入工程路径cd E:\workspace\UiAutomatorDemo1,然后输入命令android create uitest-pro ...