학습 목표
- state, props의 개념에 대해서 이해하고, 실제 프로젝트에 바르게 적용할 수 있다.
- React 함수 컴포넌트(React Function Component)에서 state hook을 이용하여 state를 정의 및 변경할 수 있다.
- React 컴포넌트(React Component)에 props를 전달할 수 있다.
- 이벤트 핸들러 함수를 만들고 React에서 이용할 수 있다.
- 실제 웹 애플리케이션의 컴포넌트를 보고 어떤 데이터가 state이고 props에 적합한지 판단할 수 있다.
- 실제 웹 애플리케이션 개발 시 적합한 state와 props의 위치를 스스로 정할 수 있다.
- React의 단방향 데이터 흐름(One-way data flow)에 대해 자신의 언어로 설명할 수 있다.
💡) 읽기 전용 객체
React에서 props는 부모 컴포넌트에서 자식 컴포넌트로 전달되는 데이터다. props는 읽기 전용 객체이므로 자식 컴포넌트에서 수정할 수 없다. 그러나 부모 컴포넌트가 자식 컴포넌트에 새로운 props를 제공하거나 기존 props를 업데이트하는 것과 같은 다른 방법으로 props를 업데이트할 수 있다.
props가 읽기 전용 객체인 이유는 자식 컴포넌트가 부모 컴포넌트의 상태를 제어하지 못하도록 하기 위해서다. 부모 컴포넌트는 자식 컴포넌트가 표시해야 하는 데이터를 제어해야 하며 자식 컴포넌트는 부모 컴포넌트가 원하는 방식으로 데이터를 표시해야 한다.
props가 읽기 전용 객체가 아니면 자식 컴포넌트가 부모 컴포넌트의 상태를 제어하고 부모 컴포넌트가 예상한 방식으로 렌더링되지 않을 수 있다.
위 단계에 맞추어 props를 사용하기 위해 우선 <Parent>
와 <Child>
라는 컴포넌트를 선언하고, <Parent>
컴포넌트 안에 <Child>
컴포넌트를 작성
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child />
</div>
);
};
function Child() {
return (
<div className="child"></div>
);
};
컴포넌트를 만들었으면 전달하고자 하는 속성을 정의.
React에서 속성 및 값을 할당하는 방법은 전달하고자 하는 값을 중괄호 {}를 이용하여 감싸줌
<Child attribute={value} />
위 방법을 이용하여 text라는 속성을 선언하고, 이 속성에 "I'm the eldest child"라는 문자열 값을 할당하여 <Child>
컴포넌트에 전달
<Child text={"I'm the eldest child"} />
<Parent>
컴포넌트에서 전달한 "I'm the eldest child"라는 문자열을 <Child>
컴포넌트에서 받는 방법은 함수에 인자를 전달하듯이 React 컴포넌트에 props를 전달하면 되고, 이 props가 필요한 모든 데이터를 가지고 옴
function Child(props) {
return (
<div className="child"></div>
);
};
props를 렌더링하려면 JSX 안에 직접 불러서 사용하면 됨 다만, props는 객체라고 하였고, 이 객체의 { key : value }는 <Parent>
컴포넌트에서 정의한 { attribute : value }의 형태
따라서 JavaScript에서 객체의 value에 접근할 때 dot notation을 사용하는 것과 동일하게 props의 value 또한 dot notation으로 접근할 수 있음
function Child(props) {
return (
<div className="child">
<p>{props.text}</p>
</div>
);
};
props를 전달하는 또 다른 방법으로 여는 태그와 닫는 태그의 사이에 value를 넣어 전달하는 방법이 있음
이 경우 props.children을 이용하면 해당 value에 접근하여 사용할 수 있음
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child>I'm the eldest child</Child>
</div>
);
};
function Child(props) {
return (
<div className="child">
<p>{props.children}</p>
</div>
);
};
컴포넌트 내에서 변할 수 있는 값, 상태
useState
사용법
useState
라는 특별한 함수를 제공useState
를 이용하기 위해서는 React로부터 useState
를 불러와야 함import
키워드로 불러올 수 있음import { useState } from "react";
const [state 저장 변수, state 갱신 함수] = useState(상태 초기 값);
사용자의 상호작용에 대한 응답으로 발생하는 동작을 다룸
컴포넌트에서 특정 동작이나 상태 변경을 하고, 애플리케이션의 동적인 동작을 구현하는데 사용
이벤트 핸들러 함수 정의: 이벤트가 발생했을 때 실행될 함수를 정의
이벤트 핸들러 함수 연결: 이벤트 핸들러 함수를 해당 이벤트와 연결하여 이벤트가 발생했을 때 실행될 수 있도록 함
// 버튼을 클릭할 때 특정 동작이 발생하도록 하는 예제
import React from 'react';
class MyComponent extends React.Component {
handleClick() {
console.log('Button clicked!');
}
render() {
return (
<button onClick={this.handleClick}>Click me</button>
);
}
}
// handleClick은 이벤트 핸들러 함수
// onClick 속성을 통해 해당 이벤트와 handleClick 함수를 연결하여, 버튼이 클릭되었을 때 handleClick 함수가 실행
// 이벤트 핸들러 함수는 클릭이벤트가 발생했을 때 'Button clicked!'을 콘솔에 출력
onClick
, onChange
, onSubmit
등 다양한 이벤트를 다룰 수 있음React의 개발 방식의 가장 큰 특징은 페이지 단위가 아닌 컴포넌트 단위로 시작한다는 점
React는 상향식으로 앱을 만듦
컴포넌트는 컴포넌트 바깥에서 props를 이용해 데이터를 인자처럼 혹은 속성처럼 전달 받을 수 있음
데이터를 전달하는 주체는 부모 컴포넌트 → 데이터 흐름이 하향식이라는 것을 의미
컴포넌트는 props를 통해 전달받은 데이터가 어디서 왔는지 전혀 알지 못함
어떤 데이터를 상태로 두어야 하는지는 다음 세 가지 질문을 통해 판단해 볼 수 있음
두 개의 자식 컴포넌트가 하나의 상태에 접근하고자 할 때는 두 자식의 공통 부모 컴포넌트에 상태를 위치시킴
React에서 데이터를 다룰 때는 컴포넌트들 간의 상호 관계와 데이터의 역할, 데이터의 흐름을 고려하여 위치를 설정