为什么在Angular中需要DoCheck生命周期挂钩?

为什么在Angular中需要DoCheck生命周期挂钩?,angular,Angular,所以我读了有关的文章,知道DoCheck在每个变更检测周期后都会被触发,然后是AfterContentChecked和AfterViewChecked。如果是这样,那么首先为什么需要DoCheck钩子?。我们在DoCheck方法中编写的所有内容都可以在AfterContentChecked或AfterViewChecked方法中编写(因为它们在DoCheck方法之后立即触发)。由于DoCheck主要用于调试目的,用其他这些生命周期挂钩替换它不会破坏任何东西。ngDocheck在“检查”组件输入时

所以我读了有关的文章,知道DoCheck在每个变更检测周期后都会被触发,然后是AfterContentChecked和AfterViewChecked。如果是这样,那么首先为什么需要DoCheck钩子?。我们在DoCheck方法中编写的所有内容都可以在
AfterContentChecked
AfterViewChecked
方法中编写(因为它们在DoCheck方法之后立即触发)。由于DoCheck主要用于调试目的,用其他这些生命周期挂钩替换它不会破坏任何东西。

ngDocheck
在“检查”组件输入时触发。此外,如果您启用了
ChangeDetectionStragegy.OnPush
,并且您的输入没有更改,则不会对组件的模板进行任何检查。正如我所记得的,所有经过检查的钩子都不会被调用

ngDoCheck
hook的有效用例是“深入”检查您的输入

例如,如果您尝试在查看检查后执行此逻辑,则会出现“检查后表达式更改”错误,因为在此钩子中视图已检查

 interface ComplexData {
   num: number;
 }
....
 @Input() data: ComplexData;
 oldNumValue: number;
 
 ngDoCheck() {
   if(this.data?.num !== this.oldNumValue) {
     // here we have a situation where default change detection could think the 
     // value didn't change, as `data` refers to the same object
     // but its field was changed instead
     this.cdRef.markForCheck();
   }
 }