跳到主要内容

生命周期函数

一、组件的生命周期函数

constructor:

最先执行,构建组建时执行。

此时,可以拿到内部定义的属性的值,不可以拿到父组件传过来的输入属性。

OnInit:

接受完父组件传递过来的值后执行。可以拿到父组件传过来的输入属性。

export class StreamComponent implements OnInit {
ngOnInit() {
}

@Input()
receiveGoods: Goods

streamTxt: string = 'aaa';
}

OnChange :

  • 只在输入属性发生变化时执行(但是不能深度监听,只在输入属性的指针发生改变时触发)
  • 内部属性变化时不会执行
export class StreamComponent implements OnChange  {
ngOnChange() {
}
}

DoCheck :

  • 可以深度监听输入属性,并且在获取或者失去焦点时都会触发,特别敏感,所以内部代码尽量轻量和高效。
  • 可以监听内部属性的变化
export class StreamComponent implements DoCheck  {
ngDoCheck() {
}
}

AfterViewInit:

视图初始化完毕之后,触发此函数

export class StreamComponent implements AfterViewInit  {
ngAfterViewInit() {
}
}

子组件的AfterViewInit先执行,父组件的AfterViewInit后执行。(因为只有子组件初始化完毕后,父组件才可能初始化完毕)

AfterViewChecked:

  • 子组件视图改变(内部属性,输入属性等)触发
  • 获取或失去焦点也会触发。
export class StreamComponent implements AfterViewChecked  {
ngAfterViewChecked() {
}
}

AfterContentInit:

这个生命周期函数与投影(内容插槽)相关。

投影(内容插槽):组件中插入的标签会在组件对应的html代码的相应位置显示。

示例:

调用stream组件的地方:

<app-stream [receiveGoods]="goods">
<h4>投影1</h4>
<p>投影2</p>
</app-stream>

stream组件的html文件:

<div>
<h3>父组件的商品:{{receiveGoods.name}}</h3>
<p>父组件的价格:{{receiveGoods.price}}</p>
自己的属性:<input type="text" [(ngModel)]="streamTxt">
<p>streamTxt: {{streamTxt}}</p>

<ng-content select="p"></ng-content>
<ng-content select="h4"></ng-content>
</div>

select的值为选择器。可以是id选择器,类选择器,标签选择器等

AfterContentInit:

  • 有投影时执行

  • 既然是内容插槽,父组件将内容插进入后,子组件才能显示。所以父组件的AfterContentInit先执行,子组件的AfterContentInit后执行。

AfterContentChecked

也是很敏感。可能修改视图时触发。

OnDestroy:

组件销毁时执行。