state
는 컴포넌트 내부에서 관리(함수 내에 선언된 변수처럼)되는 변경이 가능한 값을 말하며, 변해야하는 상태 관리를 해야 할 때 사용한다.
state
를 정의할 때는 렌더링이나 데이터 흐름에 사용되는 값만 state
에 포함시켜야 한다. 그렇지 않은 값은 컴포넌트 인스턴스의 필드로 정의한다.
state가 될 수 있는 조건
- 부모로부터 props를 통해 전달된다면 state가 아니다.
- 시간이 지나도 변하지 않는다면 state가 아니다.
- 컴포넌트 안의 다른 state나 props를 가지고 계산이 가능하다면 state가 아니다.
컴포넌트의 속성(property)을 의미한다. props
는 성별이나 이름처럼 변하지 않는 외부로부터 전달받은 값으로, 웹 애플리케이션에서 해당 컴포넌트가 가진 속성에 해당한다.
부모 컴포넌트(상위 컴포넌트)로부터 전달받은 값이다. React 컴포넌트는 JavaScript 함수와 클래스로, props
를 함수의 전달인자(arguments)처럼 전달받아 이를 기반으로 화면에 어떻게 표시되는지를 기술하는 React 엘리먼트를 반환한다. 따라서, 컴포넌트가 최초 렌더링 될 때 화면에 출력하고자 하는 데이터를 담은 초깃값으로 사용할 수 있다.
객체 형태이다. props
로 어떤 타입의 값도 넣어 전달할 수 있도록 props는 객체의 형태를 가진다.
props
는 읽기 전용이다. props
는 외부로부터 전달받아 변하지 않는 값이므로 함부로 변경될 수 없는 읽기 전용(read-only) 객체이다.
전달받은 props
값이 변하면(업데이트) 리렌더링 된다.
props 예시
- 빨간색으로 표시되어 있는 부분은 여행할 지역을 나타내고 있다. 모두 모서리가 둥근 사각형 모양에 상단에는 그림이 배경으로 들어가 있고, 하단에는 색깔로 된 배경과 글자가 들어가 있는 형태라는 것을 알 수 있다.
- 모양만 놓고 보면 모두 동일한 형태를 가지고 있지만 안에 들어있는 그림과 색상, 글자, 거리는 모두 다르다.
- 예러 개의 하위 컴포넌트에서 동일한 값을 사용해야 하는데
props
로 부모 컴포넌트에서 일괄적으로 값을 넘겨주지 않으면 자식 컴포넌트에서 일일히 값을 변경해야 한다.
- 기본 구문
<'자식 컴포넌트명' '속성명(props명, 임의 지정)' = { 넘겨줄 값 } />
function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
// 하위 컴포넌트에 전달할 값, 속성 정의
<Child text = {"I'm the child"} />
</div>
);
};
function Child() {
return (
<div className="child"></div>
);
};
function Child(props) { // props를 Child 함수의 파라미터로 전달
return (
<div className="child"></div>
);
};
props
라고 한다.function Parent() {
return (
<div className="parent">
<h1>I'm the parent</h1>
<Child text = {"I'm the child"} /> // 속성명은 text로 설정
</div>
);
};
function Child(props) {
return (
<div className="child">
// JSX를 이용하여 랜더링
<p>{props.text}</p> // 전달받은 props 객체의 키 === 부모 컴포넌트에서 설정한 속성명
</div>
);
};
<Welcome name="Sara" />
엘리먼트로 root.render()를 호출<h1>
Hello, Sara</h1>
엘리먼트를 반환<h1>
Hello, Sara</h1>
엘리먼트와 일치하도록 DOM을 효율적으로 업데이트const element = <Welcome name="Sara" />;
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(element);
Props
를 구조 분해 할당으로 넘겨줄 수 있다.props
를 받게 되면 코드를 간결하게 만들 수 있다.// 부모 컴포넌트
function Parent() {
return (
<div className="parent">
<Child title={"childComponent"} content={"I'm the child"} />
</div>
);
};
// props 값을 객체 구조 분해 하여 받고 있는 자식 컴포넌트
function Child({ title, content }) {
return (
<div className="child">
<p>{title}</p>
<p>{content}</p>
</div>
);
};
// 하드코딩한 li태그들
function App() {
return (
<ul>
<li>Menu1</li>
<li>Menu2</li>
<li>Menu3</li>
<li>Menu4</li>
</ul>
);
}
// map을 사용하여 불러온 li 태그들
function App() {
const menus = ['Menu1', 'Menu2', 'Menu3', 'Menu4']
const menuList = menus.map((menu) =>
<li key={index}>{menu}</li>
);
return (
<ul>
{menuList}
</ul>
);
}
// - App 컴포넌트(메인)
function App() {
return (
<div className="App">
<main>
<header className="App-header">
<h1>Test</h1>
</header>
{dummyTweets.map((value) =>
<List message={value} key={value.id} />
)}
</main>
</div>
);
}
// List 컴포넌트
function List({ message }) {
return (
<li className="tweet">
<div className="tweet__content">
<div className="tweet__userName">
{message.username}
</div>
<div className="tweet__message">
{message.content}
</div>
</div>
</li>
);
}
// dummyData
const dummyTweets = [
{
id: 1,
username: 'kimcoding',
content:
'모든 국민은 인간으로서의 존엄과 가치를 가지며, 행복을 추구할 권리를 가진다. 모든 국민은 종교의 자유를
가진다. 국가는 농·어민과 중소기업의 자조조직을 육성하여야 하며, 그 자율적 활동과 발전을 보장한다.
모든 국민은 양심의 자유를 가진다.
누구든지 체포 또는 구속을 당한 때에는 즉시 변호인의 조력을 받을 권리를 가진다.',
},
// ...
];