Angular生命周期(深度探究)

一、全部生命周期及触发时机。

页面结构:
父:app.component.html
子:app-child.conponent.html
以下生命周期打印输出均为子组件。
子代码:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-app-child',
  templateUrl: './app-child.component.html',
  styleUrls: ['./app-child.component.less']
})
export class AppChildComponent implements OnInit {

  constructor() { }

  ngOnChanges() {
    console.log('ngOnChanges-当 Angular 设置或重新设置数据绑定的输入属性时响应。');//当 Angular 设置或重新设置数据绑定的输入属性时响应。
  }
  ngOnInit() {
    console.log('ngOnInit-在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。');// 	在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。
  }
  ngDoCheck() {
    console.log('ngDoCheck-检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。'); //检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。
  }
  ngAfterContentInit() {
    console.log('ngAfterContentInit-当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。');//当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。
  }
  ngAfterContentChecked() {
    console.log('ngAfterContentChecked-每当 Angular 检查完被投影到组件或指令中的内容之后调用。');//每当 Angular 检查完被投影到组件或指令中的内容之后调用。
  }
  ngAfterViewInit() {
    console.log('ngAfterViewInit-当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用。');//当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用。
  }
  ngAfterViewChecked() {
    console.log('ngAfterViewChecked-每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。');//每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。
  }
  ngOnDestroy() {
    console.log('ngOnDestroy-每当 Angular 每次销毁指令/组件之前调用并清扫。');//每当 Angular 每次销毁指令/组件之前调用并清扫。
  }

}

运行结果:
在这里插入图片描述
可以看到,ngDoCheck方法执行了两次,这里是因为angular默认变化检测策略为脏检查,只要发生变化,就全部从父组件到子组件进行一次检查。
详细参考:https://blog.csdn.net/xwnxwn/article/details/82725408

二、ngOnChanges()

官方释义:
ngOnChanges() 方法获取了一个对象,它把每个发生变化的属性名都映射到了一个SimpleChange对象,该对象中有属性的当前值和前一个值。这个钩子会在这些发生了变化的属性上进行迭代,并记录它们。
触发时机:当 Angular 设置或重新设置数据绑定的输入属性时响应。
通俗的讲,当传入的值初始化或发生变化时就会触发。
初始化触发:
父:app.component.html

<p>生命周期</p>
<app-child [titleName]="title"></app-child>

子:child.component.html

<p>{{titleName}}</p>

子:child.component.ts

 @Input()
  titleName!: string;

运行结果:在这里插入图片描述
初始化触发ngOnChanges。
变更触发:
父:app.component.html

<button (click)="setTitle()">改变title</button>

父:app.component.ts

setTitle() {
    this.title = 'new life cycle';
  }

点击按钮后运行结果:
在这里插入图片描述
变更后触发ngOnChanges,触发变更检测DoCheck,ngAfterContentChecked,ngAfterViewChecked。

三、ngOnInit()

官方释义:在构造函数外部执行复杂的初始化,在 Angular 设置好输入属性之后设置组件。
触发时机:在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。
通俗的讲:ngOnInit只有首次初始化页面时触发,并且在该组件的整个生命周期中只触发一次。即使没有触发ngOnChanges也会触发ngOnInit。

四、ngDoCheck()

官方释义:检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。
触发时机:紧跟在每次执行变更检测时的 ngOnChanges() 和 首次执行变更检测时的 ngOnInit() 后调用。
通俗的讲:ngDoCheck()会在ngOnInit()和ngOnChanges() 后运行,若ngOnInit()和ngOnChanges() 都触发,ngDoCheck()会在ngOnInit()后触发,至于首次加载页面ngDoCheck()会触发两次,上文第一章末已提及,这里不做赘述。
详细参考:https://blog.csdn.net/weixin_43964866/article/details/109037532

五、ngAfterContentInit()

官方释义:当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。
调用时机:第一次 ngDoCheck() 之后调用,只调用一次。
通俗的讲:ngAfterContentInit会在页面初次加载,首次触发ngDoCheck后调用,用来在初始化视图后进行一些操作。

六、ngAfterContentChecked()

官方释义:每当 Angular 检查完被投影到组件或指令中的内容之后调用。
调用时机:ngAfterContentInit() 和每次 ngDoCheck() 之后调用。
通俗的讲:每次变更检测后都会触发该回调。

七、ngAfterViewInit()

官方释义: 当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用。
调用时机:第一次 ngAfterContentChecked() 之后调用,只调用一次。

八、ngAfterViewChecked()

官方释义:每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。
调用时机:ngAfterViewInit() 和每次 ngAfterContentChecked() 之后调用。

九、ngOnDestroy()

官方释义:每当 Angular 每次销毁指令/组件之前调用并清扫。
调用时机:在 Angular 销毁指令或组件之前立即调用。
销毁时调用,在组件生命周期中只调用一次,且调用后组件销毁。
参考:https://angular.cn/guide/lifecycle-hooks

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值