Angular 默认的Change detection策略及缺陷

简介: 默认策略下,用户事件,计时器,XHR,promise等事件触发,所有的组件都会执行变更检测。

image.png

看一个实际例子:

import { Component, OnInit, Input } from '@angular/core';
@Component({
  selector: 'appparentchild',
  template: `<h1>title</h1>
  {{ JerryHelloChange }}
  <child [childContent] = "parentContent"></child>
  `
})
export class ParentChildComponent implements OnInit {
  public parentContent = 'Jerry 222';
  constructor() { }
  get JerryHelloChange(){
    console.log('change in parent view');
    return true;
  }
  ngOnInit(): void {
    this.parentContent = '1';
    let c = setTimeout;
    setTimeout(() => this.parentContent = '2', 3000);
  }
}
@Component({
  selector: 'child',
  template: `<h1>This is child</h1>
  <h2>{{ childContent }}</h2>
  <button (click)="onClick()">Click Me to trigger Change</button> 
  <span>{{ childContent }}</span>`
})
export class ChildComponent{
  @Input()
  childContent: string;
  onClick(){
    setTimeout(()=>{ console.log('timeout!')}, 3000);
  }
}

测试结果:

image.png

import { Component, OnInit, Input, ChangeDetectionStrategy } from '@angular/core';
@Component({
  selector: 'appparentchild',
  template: `<h1>title</h1>
  {{ JerryHelloChange }}
  <child [childContent] = "parentContent"></child>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ParentChildComponent implements OnInit {
  public parentContent = 'Jerry 222';
  constructor() { }
  get JerryHelloChange(){
    console.log('change in parent view');
    return true;
  }
  ngOnInit(): void {
    this.parentContent = '1';
    let c = setTimeout;
    setTimeout(() => {
      this.parentContent = '2';
      console.log('change in parent');
    }, 3000);
  }
}
@Component({
  selector: 'child',
  template: `<h1>This is child</h1>
  <h2>{{ childContent }}</h2>
  <button (click)="onClick()">Click Me to trigger Change</button> 
  <span>{{ childContent }}</span>`
})
export class ChildComponent{
  @Input()
  childContent: string;
  onClick(){
    setTimeout(()=>{ console.log('timeout!')}, 3000);
  }
}

则虽然我在ngOnInit里将this.parentContent改成了2,但是页面仍然没有刷新,仍然是1:

image.png



相关文章
|
12月前
|
开发框架 前端开发 测试技术
什么是 Angular 企业级应用开发中的 Breaking Change
什么是 Angular 企业级应用开发中的 Breaking Change
|
算法 开发者
什么是 Angular 的 banana-in-a-box detection 机制
什么是 Angular 的 banana-in-a-box detection 机制
|
2月前
|
开发者 Windows Android开发
跨平台开发新选择:揭秘Uno Platform与.NET MAUI优劣对比,帮你找到最适合的框架,告别选择困难症!
【8月更文挑战第31天】本文对比了备受关注的跨平台开发框架Uno Platform与.NET MAUI的特点、优势及适用场景。Uno Platform基于WebAssembly和WebGL技术,支持Windows、iOS、Android及Web平台,而.NET MAUI由微软推出,旨在统一多种UI框架,支持Windows、iOS和Android。两者均采用C#和XAML进行开发,但在性能、平台支持及社区生态方面存在差异。Uno Platform在Web应用方面表现出色,但性能略逊于原生应用;.NET MAUI则接近原生性能,但不支持Web平台。开发者应根据具体需求选择合适的框架。
64 0
|
2月前
如何在 Angular 中使用变更检测策略
如何在 Angular 中使用变更检测策略
32 0
|
12月前
|
资源调度 安全 前端开发
Angular 的版本升级策略
Angular 的版本升级策略
|
12月前
|
测试技术 API 开发者
关于 Angular Component ChangeDetectionStrategy.OnPush 策略
关于 Angular Component ChangeDetectionStrategy.OnPush 策略
|
前端开发 JavaScript API
Angular Change Detection 的学习笔记
Angular Change Detection 的学习笔记
|
JavaScript IDE 开发工具
修改 Angular Component 构造函数参数被认为是 breaking change
修改 Angular Component 构造函数参数被认为是 breaking change
|
移动开发 JavaScript 网络架构
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
324 0
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
Angular Component的默认changeDetection策略
Angular Component的默认changeDetection策略
89 0
Angular Component的默认changeDetection策略
下一篇
无影云桌面