生命周期是什么?
生命周期函数通俗的讲就是组件创建、组件更新、组件销毁的时候会触发的一系列的方法。当 Angular 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些生命周期钩子方法。
生命周期的顺序
当 Angular 使用构造函数新建一个组件或指令后,就会按下面的顺序在特定时刻调用这些生命周期钩子方法:
钩子 | 用途及时机 |
---|---|
ngOnChanges() |
@input 属性(输入属性)发生变化时,会调用。非此属性,不会调用。当输入属性为对象时,当对象的属性值发生变化时,不会调用,当对象的引用变化时会触发。先于ngOnInit() 调用。 |
ngOnInit() | 只执行一次,dom操作可放在其中。(最常用) |
ngDoCheck() | 每次发生变更检测时会被调用 |
ngDoCheck() | 是Angular中的变更检测机制.它由 zone.js 来实现的.其行为是只要你的Angular中的某个组件发生异步事件.就会检查整个组件树,以保证组件属性的变化或页面的变化是同步的.所以 ngDoCheck() 的触发相当频繁的.并且是我们无法预料到的.也许我们在页面上的一个无意识操作,就会触发几个甚至几十个的 ngDoCheck() 生命周期钩子. |
ngAfterContentInit() | 在组件内容初始化之后, ngDoCheck() 之后调用,只调用一次。 |
ngAfterContentChecked() | 内容投影:父组件写在子标签之间的内容会被渲染到子模板的ng-content 中去,类似vue的slot,组件及子组件每次检查内容时调用,当父子组件都有该钩子时,父组件先执行。 |
ngAfterViewInit() | 当 Angular 初始化完组件视图及其子视图之后调用。第一次 ngAfterContentChecked() 之后调用,只调用一次。 |
ngAfterViewChecked() |
ngAfterViewInit() 和每次 ngAfterContentChecked() 之后调用。当父子组件都有该钩子时,子组件先执行。ngAfterViewChecked() 与ngAfterViewInt 中不允许修改绑定的属性(@input 属性),否则抛出异常 |
ngOnDestroy() | 每当 Angular 每次销毁指令/组件之前调用并清扫。 在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏。在 Angular 销毁指令/组件之前调用。 |