Angular 变更检测机制

什么时候触发

任何的异步操作都可以触发,实现DoCheck接口, 可以知道检测何时发生:

  1. XHR 请求
  2. Event,各种异步事件
  3. setTimeout/setInterval

9528ce4dc975417a8e791ff67797bdfa.png

一次button点击事件+一次GET请求可以触发8次检测

Angular实现机制

NgZone

Zone依赖于zone.js, 这是一个异步拦截器,针对里面封装的异步事件进行监听,有很多hooks可以获取异步事件的上下文. 默认情况下,Zone里面的run函数会涵盖大多数的异步方法,在异步结束的时候自动触发变更检测就好像:

zone.fork({
    beforeTask: () => {
        console.log('hi, beforeTask in.');
    },
    afterTask: () => {
        console.log('hi, afterTask in.');
    }
}).run(function () {
  zone.inTheZone = true;

  setTimeout(function () {
    console.log('in the zone: ' + !!zone.inTheZone);
  }, 0);
});

如何关闭变更检测

NgZong

this.zone.runOutsideAngular(() => {

// async 操作

});

改变变更检测规则

@Component({
    selector: 'newsletter',
    changeDetection: ChangeDetectionStrategy.OnPush,
    template: `...`
})

Angular 父子组建默认加载顺序

cb86f051751b4c509628cca8d3da9382.png

父类首先init,

传参给子类,触发子类的onChange方法,

子类init,兄弟类init

传参给孙子类,触发孙子类的onChange方法,

孙子类init,

孙子after view

子after view, 兄弟类after view

father after

如果记不住可以把它的运行顺序当作函数调用顺序,父类调用完调子类子类调用孙子类,孙子类调用完。返回给子类再返回给父类

默认变更检测触发顺序

此时如果改变孙子类的数据,变更检测的触发顺序如下:

5f2ff4d33d584571920b63125c33f287.png

可以看出来默认情况下是由传播的,当最底层的组件变更,他会首先找到顶层组件触发变更检测

当brother变更的时候 如下:

a4ecc03f1e6f4b10a6765e89c2530970.png

然后很神奇的我们就会发现,和上面的一模一样

所以其实当组件树的任何一个节点发生变更检测,他都会由上而下的check变更

更改变更检测策略后

改变子类策略

此时,在子类触发变更:

5be246a738fc43cdb5fcae4a038d0839.png

这时候我们可以看到孙子类的变更没有触发

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值