Angular学习笔记(十五)组件周期钩子之变更检测和DoCheck

变更检测

  • Angular的变更检测机制配合zone.js来实现,保证组建变化和页面变化同步
  • 浏览器中任何异步事件都会触发检测机制
  • 检测模版所有绑定属性,若改变则相应区域会被更新
  • 需要注意的是:变更检测机制只会把组件属性的改变反应到模版上,不会改变组件值

Angular如何进行变更检测

每个组件都有属于自己的变更检测器,当任何一个变更检测器检查到变化,zone.js会根据组件的变更检测策略来检查组件,以判断组件是否需要更新它的模版。

检测策略

  • Default策略,默认情况下所有组件都使用Default策略
  • OnPush策略
    如果所有组件都使用Default策略,不管变更发生在哪个组件上,zone.js会检测整个组件树,但会跳过使用OnPush策略的组件,OnPush策略的组件只有当其输入属性(即@Input)发生改变时,zone.js才会检测这个组件及其子组件。

更改策略,在@component加上changeDetection:ChangeDetectionStrategy.OnPush

DoCheck

检测Angular自身无法捕获的变更并采取行动

  • 这个钩子的初次调用是因为数据渲染,而后来的仅仅只是点击input框,也会调用ngDoCheck钩子
  • 使用这个钩子时需注意,用在特定事件发生时才触发业务逻辑,否则会造成后台数据过大

demo:
docheck.component.html

<tr><td>Name: </td><td><input [(ngModel)]="name"></td></tr>
 
 
 
 
  • 1

docheck.component.ts

export class DocheckComponent implements OnInit, DoCheck {
  name:string;
  counts:number = 0;
  oldName:string;
  constructor() { }

  ngOnInit() {
    this.name = '张三';
  }
  ngDoCheck():void{
    if(this.name!==this.oldName){
        console.log(`你从${this.oldName}改成${this.name}`);
        this.oldName = this.name;
    }else{
        this.counts = this.counts + 1;
        console.log("没有任何改变地调用了"+this.counts+"次");          
    }

  }

}


这里写图片描述

并不是只有docheck.component组件才会触发ngDoCheck钩子的调用,页面上的点击事件也会触发ngDoCheck钩子的调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值