Angular学习笔记(十四)之生命周期钩子和OnChanges

组件生命周期

先丢上一张组件生命周期钩子图
这里写图片描述

其中红色代表只执行一次(初始化类型的钩子),绿色代表执行多次(检测类型钩子)

钩子解释

钩子解释
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钩子

天气好冷。。。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值