5 способов передачи данных из родительского компонента в дочерний в Angular

В Angular связь между компонентами является общим требованием. Одним из распространенных сценариев является ситуация, когда вам необходимо передать данные из родительского компонента в его дочерний компонент. В Angular есть несколько способов добиться этого, и в этой статье блога мы рассмотрим пять различных методов с примерами кода. Давайте погрузимся!

Метод 1: привязка ввода
Самый простой и понятный способ передачи данных из родительского компонента в дочерний компонент — использование привязки ввода. В шаблоне родительского компонента вы можете привязать свойство к входному свойству дочернего компонента. Вот пример:

// Parent Component
@Component({
  selector: 'app-parent',
  template: `
    <app-child [data]="parentData"></app-child>
  `
})
export class ParentComponent {
  parentData = 'Hello from parent!';
}
// Child Component
@Component({
  selector: 'app-child',
  template: `
    <p>{{ data }}</p>
  `
})
export class ChildComponent {
  @Input() data: string;
}

Метод 2: ViewChild
Если дочерний компонент является прямым дочерним элементом родительского компонента, вы можете использовать декоратор ViewChild для прямого доступа к экземпляру дочернего компонента и его свойствам. Вот пример:

// Parent Component
import { ViewChild, ElementRef } from '@angular/core';
@Component({
  selector: 'app-parent',
  template: `
    <app-child></app-child>
  `
})
export class ParentComponent {
  @ViewChild(ChildComponent) childComponent: ChildComponent;
  passDataToChild() {
    this.childComponent.data = 'Hello from parent!';
  }
}
// Child Component
@Component({
  selector: 'app-child',
  template: `
    <p>{{ data }}</p>
  `
})
export class ChildComponent {
  data: string;
}

Метод 3: Сервис
Другой подход — использовать сервис в качестве посредника между родительским и дочерним компонентами. Служба может хранить общие данные и предоставлять методы для получения и установки данных. И родительский, и дочерний компоненты могут внедрять и использовать службу для связи. Вот пример:

// Data Service
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class DataService {
  private sharedData: string;
  getData(): string {
    return this.sharedData;
  }
  setData(data: string) {
    this.sharedData = data;
  }
}
// Parent Component
@Component({
  selector: 'app-parent',
  template: `
    <button (click)="passDataToChild()">Pass Data</button>
  `
})
export class ParentComponent {
  constructor(private dataService: DataService) {}
  passDataToChild() {
    this.dataService.setData('Hello from parent!');
  }
}
// Child Component
@Component({
  selector: 'app-child',
  template: `
    <p>{{ data }}</p>
  `
})
export class ChildComponent {
  constructor(private dataService: DataService) {}
  get data(): string {
    return this.dataService.getData();
  }
}

Метод 4: ссылочная переменная шаблона
Если родительский и дочерний компоненты не связаны напрямую, вы можете использовать ссылочную переменную шаблона для передачи данных от родительского элемента к дочернему. В шаблоне родительского компонента вы можете назначить ссылочную переменную дочернему компоненту и передать данные через вызов метода. Вот пример:

// Parent Component
@Component({
  selector: 'app-parent',
  template: `
    <app-some-other-component #child></app-some-other-component>
    <button (click)="passDataToChild(child)">Pass Data</button>
  `
})
export class ParentComponent {
  passDataToChild(childComponent: any) {
    childComponent.setData('Hello from parent!');
  }
}
// Child Component
@Component({
  selector: 'app-some-other-component',
  template: `
    <p>{{ data }}</p>
  `
})
export class SomeOtherComponent {
  data: string;
  setData(data: string) {
    this.data = data;
  }
}

Метод 5: Event Emitter
Если вам нужно передать данные от родительского компонента дочернему в ответ на событие, вы можете использовать класс EventEmitter. Родительский компонент генерирует событие, а дочерний компонент прослушивает это событие и получает данные. Вот пример:

// Parent Component
@Component({
  selector: 'app-parent',
  template: `
    <button (click)="passDataToChild()">Pass Data</button>
  `
})
export class ParentComponent {
  @Output() dataPassed = new EventEmitter<string>();
  passDataToChild() {
    this.dataPassed.emit('Hello from parent!');
  }
}
// Child Component
@Component({
  selector: 'app-child',
  template: `
    <p>{{ data }}</p>
  `
})
export class ChildComponent {
  @Input() data: string;
  ngOnChanges(changes: SimpleChanges) {
    if (changes.data && changes.data.currentValue) {
      // handle data change
    }
  }
}

В этой статье блога мы рассмотрели пять различных методов передачи данных из родительского компонента в дочерний компонент в Angular. Мы рассмотрели привязку ввода, ViewChild, службу, ссылочную переменную шаблона и источник событий. В зависимости от вашего конкретного случая использования вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Приятного кодирования!