组件生命周期
先丢上一张组件生命周期钩子图
其中红色代表只执行一次(初始化类型的钩子),绿色代表执行多次(检测类型钩子)
钩子解释
钩子 | 解释 |
---|---|
constructor | 实例化对象 |
ngOnchanges | 初始化输入属性 |
ngOnInit | 初始化(除输入属性外的)其他属性 |
ngDoCheck | 组件变更检测 |
ngAfterContentInit | 投影内容初始化,第一次ngDoCheck()之后调用。 |
ngAfterContentChecked | 针对投影内容的变更检测 |
ngAfterViewInit | 初始化完组件视图及其子视图之后调用。第一ngAfterContentChecked()之后调用 |
ngAfterViewChecked | 每次做完组件视图和子视图的变更检测之后调用 |
ngOnDestory | 当Angular每次销毁指令/组件之前调用并清扫。 在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏。 |
每一个钩子都是angular/core定义的接口,如OnInit
每一个接口都有一个唯一的钩子方法,使用ng+钩子接口名,如ngOnInit
Onchanges
(概念)ngOnchanges在父组件(初始化或修改)子组件的输入参数下调用,用在有输入属性的子组件。
(?情况下调用)当修改子组件参数时,只有以下情况ngOnchanges才会被调用
- 子组件的参数为输入属性且为不可变对象变化时
- 输入属性:@Input()属性
- 不可变对象:原始值(undefined、null、布尔值、数字和字符串)
- 可变对象:对象(包括数组和函数)
(?可变/不可变)关于可变对象和不可变对象的理解:
- 可变对象
var greeting = 'hello';
greeting = 'hello world';
greeting 的值发生改变,因为其指向的字符串地址从‘hello’指向了‘hello world’
- 不可变对象
var user = {name:Tom};
user.name = "Jerry";
user的指向的内存地址并没有改变,改变的是user对象中的name属性
- ngOnChanges 钩子接收一个类型为 SimpleChange 的映射对象,包括新值和旧值。
(简单例子)
在子组件changes.component.ts
export class ChangesComponent implements OnInit,OnChanges {
@Input()
str:string;
@Input()
user:{name:string}
constructor() { }
ngOnInit() {
}
ngOnChanges(changes:SimpleChanges) {
// console.log(changes);
console.log(JSON.stringify(changes,null,2));
}
}
在父组件app.component.ts
export class AppComponent {
str:string = 'hello world';
user:{name:string} = {'name':'Tom'};
}
在父组件html
str的值<input type="text" [(ngModel)]="str">
user的值<input type="text" [(ngModel)]="user.name">
<app-changes [str]="str" [user]="user"></app-changes>
父组件修改不可变对象str的值时,会调用ngOnChange钩子。修改可变对象uesr值是不会调用ngOnChange钩子
天气好冷。。。。。