关于 Angular—OnPush策略的变更检测

关于 Angular—OnPush策略的变更检测

当组件通过在@Component中添加 changeDetection: ChangeDetectionStrategy.OnPush,变更检测的变化:

#####不会触发的情况:

  1. 请求服务端数据,如xmlHttpRequest 回调中修改数据,不会触发变更检测,后续的该数据触发数据渲染也会延迟一步
  2. 定时事件,比如setTimeout,setInterval,promise等 不会触发变更检测
会触发的情况:
  1. 用户输入操作及事件,比如click, keyup,submit等,会触发变更检测!!
  2. input传值发生了变化(值类型的值变化或者引用类型的引用变化或者不可变类型变化),会触发该子组件的变更检测!!
无法触发变更的时候需要手动触发
  • markForCheck() - 在组件的 metadata 中如果设置了 changeDetection:ChangeDetectionStrategy.OnPush 条件,那么变化检测不会再次执行,除非手动调用该方法, 该方法的意思是在变化监测时必须检测该组件。

  • detach() - 从变化检测树中分离变化检测器,该组件的变化检测器将不再执行变化检测,除非手动调用 reattach() 方法。

  • reattach() - 重新添加已分离的变化检测器,使得该组件及其子组件都能执行变化检测

  • detectChanges() - 从该组件到各个子组件执行一次变化检测

不是特殊情况,推荐使用 markForCheck 方法来触发检测,检测范围只会检测一条组件树分支上的数据。

一次事件轮询阶段 调用markForCheck方法都能进行检测变更

例如:

setTimeout(() => {
    // this.changeRef.markForCheck(); // 位置1
    this.name = "小画"
    this.changeRef.markForCheck(); // 位置2
}, 2000);

// 无论放在位置1 还是位置2 都会变更检测
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值