props와 state는 일반 자바스트립트 객체이다. 두 객체 모두 렌더링에 영향을 주는 정보를 갖고 있는데, 한 가지 중요한 방식에서 차이가 있다. props는 컴포넌트에 전달되는 반면 state는 컴포넌트 안에서 관리된다.
그러므로 컴포넌트 내부에서 변경하고 싶은 값이 있을 때, state를 활용하면 된다.
const App = () => {
const [state, setState] = useState("초기값");
}
배열 비구조화 할당 문법으로, useState 함수를 호출할 시 배열이 반환되고, 배열이 첫 번째 원소는 현재 상태, 두 번째 원소는 상태를 바꾸어 주는 함수가 된다.
즉 state는 현재 state의 상태가 저장되고, setState는 state를 바꾸어 주는 setter 함수가 된다.
자식 컴포넌트에게 값을 전달해줘야 할 때, props를 사용한다.
import React from 'react';
import Hello from './Hello';
function App() {
return (
<Hello name="react" />
);
}
export default App;
그럼 자식 컴포넌트에서 값을 받을 땐 어떻게 해야할까?
import React from 'react';
function Hello(props) {
return <div>안녕하세요 {props.name}</div>
}
export default Hello;
props
로 받는다. props
는 객체 형태로 전달 되며 name
값을 조회하고 싶다면 props.name
을 조회하면 된다.import React from 'react';
import Hello from './Hello';
function App() {
return (
<Hello name="react" color="red"/>
);
}
export default App;
import React from 'react';
function Hello(props) {
return <div style={{ color: props.color }}>안녕하세요 {props.name}</div>
}
export default Hello;
import React from 'react';
function Hello({ color, name }) {
return <div style={{ color }}>안녕하세요 {name}</div>
}
export default Hello;
props 내부의 값을 조회할 때마다 props.
를 쓰는게 싫다면, 파라미터에서 비구조화 할당 문법을 사용해 props값을 주고 받을 수 있다.
import React from 'react';
function Wrapper({ children }) {
const style = {
border: '2px solid black',
padding: '16px',
};
return (
<div style={style}>
{children}
</div>
)
}
export default Wrapper;
import React from 'react';
import Hello from './Hello';
import Wrapper from './Wrapper';
function App() {
return (
<Wrapper>
<Hello name="react" color="red"/>
<Hello color="pink"/>
</Wrapper>
);
}
export default App;
리액트에서는 유동적인 데이터를 저장하기 위해 state라는 것을 사용하는데, 이때 값을 바꿔주기 위해서는 state를 직접 바꾸는 것이 아니라 setState 함수를 써야한다.
state의 변경이 감지되면 리액트는 리렌더링을 한다.
전달받은 props 값이 업데이트 됐다면 리렌더링 된다.
새로운 props가 들어오지 않더라도 부모컴포넌트가 리렌더링 되면 자식컴포넌트 역시 리렌더링이 된다.