在 Angular 中,当父组件重新请求接口并获得新数据时,需要将这些新数据传递给子组件,并通知它们更新自己的视图。

使用 @Input 装饰器将数据从父组件传递到子组件。

在父组件中,将新数据传递给子组件:

<app-child [data]="newData"></app-child>

在子组件中,通过 @Input 装饰器接收数据:

@Input() data: any;

当数据发生更改时,子组件按照常理会自动更新视图。

但是,存在一些特殊情况:

1.如果子组件的变更检测策略为 OnPush,则必须手动告诉 Angular 当前组件的输入属性发生了变化。这样,Angular 才能正确地更新视图。

import { Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-child',
  template: '<p>{{ data }}</p>',
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent {
  @Input() data: any;

  constructor(private cdr: ChangeDetectorRef) {}

  ngOnChanges() {
    this.cdr.markForCheck();
  }
}

2.如果更新的是父组件中的引用类型数据,例如数组或对象,并且子组件通过 @Input() 等方式引用这些数据,则可能需要手动处理这些数据,以确保子组件可以正确响应更新。

例如,在更新数组数据时可以使用浅拷贝来创建一个新的数组:

// 更新数据并创建新的数组
this.myArray = [...this.myArray, newValue];

如果子组件有自己的init方法,可以使用 ngOnChanges 生命周期钩子监视输入属性值的更改并调用自定义的init方法更新视图。

在子组件中添加 ngOnChanges 钩子:

ngOnChanges(changes: SimpleChanges) {
  if (changes.data) {
    // 获取新值
    this.data = changes.data.currentValue;
    // 调用init方法,刷新视图
    this.initTable(this.data);
  }
}
04-25 12:25