[Angular]@Input@ouput 컴포넌트 데이터 공유하는 방법
Angular에서 컴포넌트 간에 데이터를 주고 받기 위해 사용되는 것이 바로 @Input(), @Ouput() 데코레이터이다. @Input()은 부모 컴포넌트에서 자식 컴포넌트로, @Output()은 자식 컴포넌트에서 부모 컴포넌트로 데이터를 전달할 때 사용합니다.
@Input()
@Input() 데코레이터는 자식 컴포넌트/디렉티브에 있는 특정 프로퍼티(어떠한 값)가 부모 컴포넌트/디렉티브에서 값을 받는다는 것을 지정하는 데코레이터다.
자식 컴포넌트로 데이터 전달하기
자식 컴포넌트 설정
- @Input 심볼 로드
import { Component, Input } from '@angular/core';
- 프로퍼티에 @Input 데코레이터를 지정
@Input() item = '';
- 자식 컴포넌트에 부모 컴포넌트에서 받은 데이터 사용
<p> Today's item: {{item}} </p>
import { Component, Input } from '@angular/core'; // Input 심볼을 로드 export class ItemDetailComponent { @Input() item = ''; // 프로퍼티에 @Input() 데코레이터를 지정 }
<p> Today's item: {{item}} </p>
부모 컴포넌트 설정
- 부모 컴포넌트 템플릿에 자식 컴포넌트 셀렉터를 추가
<app-item-detail></app-item-detail>
- 프로퍼티 바인딩으로 부모 컴포넌트의 프로퍼티를 자식 컴포넌트의 프로퍼티로 바인딩
<app-item-detail [item]="currentItem"></app-item-detail>
- 부모 컴포넌트 클래스에서 부모 컴포넌트의 프로퍼티에 값을 할당한다.
currentItem = 'saichoi';
export class AppComponent { currentItem = 'Television'; }
<app-item-detail [item]="currentItem"></app-item-detail>
@Output()
@Output() 데코레이터는 자식 컴포넌트/디렉티브에서 부모 컴포넌트/디렉티브로 데이터를 전달할 수 있다. 자식 컴포넌트에서 부모 컴포넌트로 데이터를 전달하기 위해서는 이벤트를 발생시켜야하는데 이때 @Output() 데코레이터는 반드시 EventEmitter 타입의 프로퍼티에 선언해야 한다. 이 커스텀 이벤트 클래스는 @angular/core
패키지에서 제공하는 클래스다.
부모 컴포넌트로 데이터 전달하기
자식 컴포넌트 설정하기
- 자식 컴포넌트 클래스 파일에 Output, EventEmitter 심볼을 로드
import { Output, EventEmitter } from '@angular/core';
- 컴포넌트 클래스에서 프로퍼티에 @Output() 데코레이터를 지정
@Output() newItemEvent = new EventEmitter<string>();
- 자식 컴포넌트에 매서드 추가
addNewItem(value: string) { this.newItemEvent.emit(value); }
addNewItem()
함수는 @Output() 데코레이터가 지정된newItemEvent
를 활용해서 이벤트를 발생시키며, 이 때<input>
엘리먼트에 사용자가 입력한 값을 함께 전달합니다.
import { Output, EventEmitter } from '@angular/core'; export class ItemOutputComponent { @Output() newItemEvent = new EventEmitter<string>(); addNewItem(value: string) { this.newItemEvent.emit(value); } }
<label for="item-input">Add an item:</label> <input type="text" id="item-input" #newItem>output-child <button (click)="addNewItem(newItem.value)">Add to parent's list</button>
사용자가 <input>에 입력한 value 값을 가지고 와서 자식 컴포넌트의 addNewItem 매서드의 인자값으로 받는다.
부모 컴포넌트 설정하기
- 자식 컴포넌트에서 받아온 값을 부모 컴포넌트의 매서드를 이용해 프로퍼티에 담기
export class AppComponent { items = ['item1', 'item2', 'item3', 'item4']; addItem(newItem: string) { this.items.push(newItem); } }
- 부모 컴포넌트 템플릿에 데이터를 로드
<app-item-output (newItemEvent)="addItem($event)"></app-item-output> <ul> <li *ngFor="let item of items">{{item}}</li> </ul>
$event
는 자식 컴포넌트에서 받아온 데이터다. 이 예제에서는 <input>으로 넘겨준 데이터를 의미한다.
@Input(), @Output 함께 사용하기
하나의 컴포넌트에서 @Input(), @Output을 동시에 사용할 수도 있다.
<app-input-output [item]="currentItem" (deleteRequest)="crossOffItem($event)"> </app-input-output>