부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하는데 사용되는 매개변수이다.
props를 이용해 부모 컴포넌트는 자식 컴포넌트에게 정보를 전달하고, 자식 컴포넌트는 전달받은 데이터를 이용한다.
읽기전용 : 부모로 부터 전달받은 props는 읽기전용으로 자식 컴포넌트는 해당 값을 수정할 수 없다.
데이터흐름 : 부모 컴포넌트는 자식 컴포넌트에게 props를 전달함으로서 부모와 자식 간의 데이터 흐름을 구성할 수 있다.
전달방법 : 함수형 컴포넌트에서 props는 매개변수처럼 사용되며, 클래스형 컴포넌트에서는 this.props를 통해 접근할 수 있다.
import './App.css';
import ToDoForm from './components/ToDoForm/ToDoForm';
import ToDoList from './components/ToDoList/ToDoList';
function App() {
const todoList = [
{title: 'Clean my room', id: 1},
{title: 'Study English', id:2}
]
return (
<div className="App">
<ToDoForm></ToDoForm>
<ToDoList todoList={todoList}></ToDoList>
</div>
);
}
export default App;
위 코드를 보면 todoList 배열을 ToDoList 컴포넌트에 todoList라는 이름으로 props로 전달하고 있다. todoList 배열안 객체는 각각 id 값을 가지고 있다. 이 id값은 각 요소의 key 값으로 사용된다.
const ToDoList = (props) => {
return (
<div>
<ul>
{props.todoList.map((list) => {
return (
<li>
<span>{list.title}.</span>
<button type="button">X</button>
</li>
);
})}
</ul>
</div>
);
};
export default ToDoList;
전달받은 props는 함수의 매개변수 형태로 접근할 수 있으며, 배열을 받았기 때문에 map 함수를 사용해 배열의 모든 인덱스들을 출력한다.
현재 상태는 부모 컴포넌트로부터 전달받은 값들만 출력하고 있으니 ToDoForm 컴포넌트에서 전달받은 값을 출력해보자.
자식에서 부모로 값을 넘기는 방법은 함수를 이용하는 것이다.
import './App.css';
import ToDoForm from './components/ToDoForm/ToDoForm';
import ToDoList from './components/ToDoList/ToDoList';
function App() {
const todoList = [
{title: 'Clean my room', id: 1},
{title: 'Study English', id:2}
]
const getToDo = (todo) => {
todoList.push(todo);
console.log(todoList);
}
return (
<div className="App">
<ToDoForm onGetTodo={getToDo}></ToDoForm>
<ToDoList todoList={todoList}></ToDoList>
</div>
);
}
export default App;
부모 컴포넌트인 App.js에서 getToDo함수를 선언해 ToDoForm 컴포넌트로 props로 전달한다.
const ToDoForm = (props) => {
const submitHandler = (event) => {
const title = document.querySelector('#todoInput').value;
event.preventDefault();
const todo = {title: title, id: Math.random()};
props.onGetTodo(todo);
}
return (
<div>
<form onSubmit={submitHandler}>
<label htmlFor='todoInput'>Type your To Do.</label>
<input id='todoInput' type='text'></input>
<button type='submit'>Add</button>
</form>
</div>
);
};
export default ToDoForm;
ToDoForm 컴포넌트의 form 태그에 onSubmit 속성을 이용해 form이 제출 될때 실행할 함수를 선언해 주고 preventDefault 메소드를 이용해 페이지가 새로고침 되지 않도록 한다.
submitHandler 함수에 의해 form이 제출될때마다 input의 value가 title이 된 todo 객체가 생성되고, props를 통해 전달받은 부모 컴포넌트의 onGetTodo함수를 실행하면 부모 컴포넌트로 파라미터를 통해 값이 전달된다.
실행 결과는 아래와 같다.

todoList 배열에 새로운 값인 Study React 가 추가된것을 확인할 수 있다.
현재 값을 전달받아 todoList에 추가는 되었지만 페이지에서는 todo가 추가되지 않았다.
다음에는 useState()를 이용해 전달받은 값을 바로바로 화면에 출력해보자.
key ➡️ 나중에 알아보자.