我是靠谱客的博主 小巧月亮,这篇文章主要介绍一文聊聊Angular中的生命周期,现在分享给大家,希望可以做个参考。

使用angular进行开发时,避免不了需要接触生命周期,下面本篇文章就来带大家一起聊聊Angular中的生命周期,希望对大家有所帮助!

接触过 reactvue 开发的读者应该对生命周期这个概念不陌生。我们在使用 angular 开发的过程中,是避免不了的。【相关教程推荐:《angular教程》】

组件从开始建立到销毁的过程中,会经历过一系列的阶段。这就是一个生命周期,这些阶段对应着应用提供的 lifecycle hooks

那么,在 angular 中,这些 hooks 都有哪些呢?了解它们,对你编写程序应该在哪里编写,很重要。

angular 中,生命周期执行的顺序如下:

复制代码
1
2
3
4
5
6
7
8
9
- constructor 【常用,不算钩子函数,但是很重要】 - ngOnChanges【常用】 - ngOnInit【常用】 - ngDoCheck - ngAfterContentInit - ngAfterContentChecked - ngAfterViewInit【常用】 - ngAfterViewChecked - ngOnDestroy【常用】
登录后复制

为了解说和验证,我们用 angular-cli 生成一个 demo 项目。

constructor

es6 中的 class 初始化对象的时候,constructor 会立即被调用。

复制代码
1
2
3
4
5
6
7
8
class Person { constructor(name) { console.log('be called') this.name = name; } } let jimmy = new Person('jimmy'); // be called
登录后复制

angular 的组件本身就是导出一个类。当这个组件被 new 起来的时候,会获取 constructor 中的预设的值。

ngOnChanges

当我们有外部参数更改的时候,我们就会执行 ngOnChanges,也就是说组件中有 @Input 所绑定的属性值发生改变的时候调用。

简单说,父组件绑定子组件中的元素,会触发这个钩子函数,可以多次出发。这在下面的 ngOnInit 总会介绍。

ngOnInit

这个方法调用的时候,说明组件已经初始化成功。在第一次 ngOnChanges() 完成之后调用,且只调用一次。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// app.component.ts export class AppComponent implements OnInit, OnChanges { constructor() { console.log('1. constructor') } ngOnChanges() { console.log('2. ngOnChanges') } ngOnInit() { console.log('3. ngOnInit') } }
登录后复制

打印的信息如下:

1.png

咦?怎么没有打印 ngOnChanges 中的钩子函数信息呢?

上面已经说过了,需要触发条件 @Input 的属性值改变的时候。我们来修改一下:

复制代码
1
2
3
4
<!-- app.component.html --> <div> <app-demo></app-demo> </div>
登录后复制
复制代码
1
2
3
// app.component.ts // AppComponent 类中添加属性 public count:number = 0;
登录后复制
复制代码
1
2
<!-- demo.component.html --> <h3>count: {{ count }}</h3>
登录后复制
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// demo.component.ts export class DemoComponent implements OnInit, OnChanges { @Input() public count: number; constructor() { console.log('1. demo constructor') } ngOnChanges() { console.log('2. demo ngOnChanges') } ngOnInit() { console.log('3. demo ngOnInit') } }
登录后复制

2.png

当通过 @Input 将值传递给子组件 demo 的时候,就会触发 demo 组件中的 ngOnChanges

@Input 传递的属性发生改变的时候,可以多次触发 demo 组件中的 ngOnChanges 钩子函数。

复制代码
1
2
3
4
5
6
<!-- app.component.html --> <div> <app-demo [count]="count"></app-demo> <button (click)="parentDemo()">parent button</button> </div>
登录后复制
复制代码
1
2
3
4
// app.component.ts parentDemo() { this.count++; }
登录后复制

3.gif

ngDoCheck

当发生变化检测的时候,触发该钩子函数。

这个钩子函数,紧跟在每次执行变更检测时候 ngOnChanges 和首次执行执行变更检测时 ngOnInit 后面调用。

复制代码
1
2
3
4
5
// demo.component.ts ngDoCheck() { console.log('4. demo ngDoCheck') }
登录后复制

4.gif

这个钩子函数调用得比较频繁,使用成本比较高,谨慎使用。

ngAfterContentInit

当把外部的内容投影到内部组件,第一次调用 ngDoCheck 之后调用 ngAfterContentInit,而且只调用一次。

复制代码
1
2
3
4
5
// demo.component.ts ngAfterContentInit() { console.log('5. demo ngAfterContentInit'); }
登录后复制

5.png

ngAfterContentChecked

ngAfterContentChecked 钩子函数在每次 ngDoCheck 之后调用.

复制代码
1
2
3
4
5
// demo.component.ts ngAfterContentChecked() { console.log('5. demo ngAfterContentChecked'); }
登录后复制

6.gif

ngAfterViewInit

视图初始化完成调用此钩子函数。在第一次 ngAfterContentChecked 之后调用,只调用一次。

这个时候,获取页面的 DOM 节点比较合理

复制代码
1
2
3
4
5
// demo.compoent.ts ngAfterViewInit() { console.log('7. demo ngAfterViewInit'); }
登录后复制

7.png

ngAfterViewChecked

视图检测完成调用。在 ngAfterViewinit 后调用,和在每次 ngAfterContentChecked 之后调用,也就是在每次 ngDoCheck 之后调用。

复制代码
1
2
3
4
5
// demo.component.ts ngAfterViewChecked() { console.log('8. ngAfterViewChecked') }
登录后复制

8.gif

ngOnDestroy

组件被销毁时候进行的操作。

复制代码
1
2
3
4
<!-- app.component.html --> <app-demo [count]="count" *ngIf="showDemoComponent"></app-demo> <button (click)="hideDemo()">hide demo component</button>
登录后复制
复制代码
1
2
3
4
5
6
// app.component.ts public showDemoComponent: boolean = true; hideDemo() { this.showDemoComponent = false }
登录后复制
复制代码
1
2
3
4
// demo.component.ts ngOnDestroy() { console.log('9. demo ngOnDestroy') }
登录后复制

9.gif

【完】

最后

以上就是小巧月亮最近收集整理的关于一文聊聊Angular中的生命周期的全部内容,更多相关一文聊聊Angular中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(103)

评论列表共有 0 条评论

立即
投稿
返回
顶部