1. 컴포넌트 내부에서 선언한다.
2. 컴포넌트 내에서 변경될 수 있다.
3. state는 해당 컴포넌트에 속한다.(데이터 소유권)
4. state가 변경되면 해당 컴포넌트와 그 자식 컴포넌트들이 다시 렌더링된다.(업데이트)
💡 hook: 함수형 컴포넌트에서 상태 관리, 생명주기 메서드, Context, 렌더링 제어 등의 기능을 제공하는 함수
// useState를 사용하기 위해 import해야 한다. import { useState } from "react"; function func() { // useState훅을 사용 // text라는 현재상태와 setText라는 상태변경 함수 선언 // 초기값은 "" const [text, setText] = useState(""); // input의 값이 변경될 때 호출 const handleChange = (event) => { // input의 값을 text에 업데이트한다. setText(event.target.value); }; return ( <div> <input type="text" value={text} onChange={handleChange} /> <p>{text}</p> </div> ); }
1. 읽기 전용 데이터이다.
2. 부모 컴포넌트에서 소유된다.
3. 부모 컴포넌트에서 전달하는 props가 변경되면 해당 자식 컴포넌트가 다시 렌더링된다.
❗ 주의점
props로 전달하는 것은 최대 1 depth으로 제한하는것이 좋다.
props를 이용해 깊이 전달 될수록 코드가 복잡해지고 알아보기 힘들어진다.
이 문제를 해결하기 위해서는 전역 상태관리를 도와주는 라이브러리를 사용해야 한다.
function func(props) { // props를 매개변수로 <p>Hello {props.name}</p>를 반환한다. return <p>Hello {props.name}</p>; } function App() { return ( <div> <Name name="John" /> <Name name="Jane" /> </div> ); }
const Component = (props) => { return ( <div className="component"> {props.children} </div> ); }; const App = () => { return ( <Component> <p>Hello</p> </Component> ); };
실행결과
<div class="component"> <p>Hello</p> </div>
{props.children}
는 <Component></Component>
내부에 있는 <p>Hello</p>
를 가리키므로 위와 같은 결과가 나온다.<input>, <textarea>, <select>
와 같은 입력값에 따라 변경되는 이벤트를 처리하는데 사용한다.💡 카멜 케이스: 첫 단어를 소문자로 시작하고, 그 이후 단어의 첫 글자는 대문자로 쓰는 방식
function func() { const [text, setText] = useState(""); // 이벤트이므로 첫 단어는 소문자 이후는 대문자인 handleChange로 선언한다. const handleChange = (event) => { setText(event.target.value); }; return ( <input type="text" value={text} onChange={handleChange}></input> ); }
<button>
과 같은 클릭 이벤트를 처리하는데 사용한다.function Button() { const handleClick = () => { console.log('Button click'); }; return ( <button onClick={handleClick}>Click me</button> ); }