Înțelegerea @Input, @Output și EventEmitter în Angular

Pentru cei care sunt noi în Angular, decoratorii Input și Output sunt un pic confuzi, mai ales când îi studiezi uitându-te la codul de exemplu. În acest articol, voi încerca să le explic în cel mai simplu mod.

Un instrument pentru a face schimb de date

În primul rând, ideea de Input și Output este de a face schimb de date între componente. Ele reprezintă un mecanism de trimitere/recepție a datelor de la o componentă la alta.

Input este utilizat pentru a primi date în timp ce Output este utilizat pentru a trimite date în exterior. Output trimite date în exterior prin expunerea producătorilor de evenimente, de obicei obiecte EventEmitter.

Așa că atunci când vedeți un cod ca acesta

@Component({
selector: 'todo-item',
...
})export class TodoItemComponent {
@Input() item
@Output() onChange = new EventEmitter()
}

aceasta înseamnă

  • hei, aștept să mi se trimită date. Le voi primi și le voi stoca în proprietatea mea item
  • de altfel, voi produce și voi trimite date prin intermediul proprietății onChange.

Să spunem că aveți o componentă TodoList care conține o componentă TodoItem. În șablonul TodoList, este de așteptat să vedeți

...
<todo-item
="myTask"
(onChange)="handleChange($event)"
</todo-item>
...

ceea ce înseamnă

  • TodoList pune valori de date în proprietatea sa myTask și le transmite către TodoItem
  • datele emise de TodoItem vor fi primite și gestionate de funcția handleChange() din TodoList

Asta e tot pentru teorie. Să ne uităm la exemplu.

@Input și @Output în acțiune

Vezi acest exemplu. Aici am creat 2 componente, componenta hello imbricate în componenta app. Componenta hello are o intrare și o ieșire

hello.component.ts
@Component({
selector: 'hello',
template: `
<h3 (click)="onClick.emit('Neo')">
...
</h3>
`
})export class HelloComponent {
@Input() myFriend: string
@Output() onClick = new EventEmitter()
}

Se așteaptă să primească o valoare de tip șir de caractere și o stochează în proprietatea myFriend.

@Input() myFriend: string

De fiecare dată când faceți clic pe ea, proprietatea Output onClick va emite un șir de caractere ‘Neo’ către lumea exterioară.

<h3 (click)="onClick.emit('Neo')">

Mai jos este componenta de aplicație

app.component.ts
export class AppComponent {
ng = 'Angular'
myName = 'Neo' upCase(st:string): void { ... }
}app.component.html
<hello myFriend="{{ ng }}" (onClick)="upCase($event)"></hello>
<h3>My name is {{ myName }}</h3>

Rețineți că componenta de aplicație folosește tag-ul hello în șablonul său și face două lucruri:

  • pasează o valoare de șir de caractere ‘Angular’ către hello prin intermediul proprietății sale ng
<hello myFriend="{{ ng }}"
  • recepe valoarea emisă de hello și procesează această valoare prin funcția upCase()
<hello myFriend="{{ ng }}" (onClick)="upCase($event)">

Puteți vedea aplicația în acțiune aici

.