useState): 컴포넌트의 기억 장치Props가 부모로부터 받은 "외부 데이터"라면, State(상태)는 컴포넌트가 내부적으로 소유하고 관리하는 "내부 데이터"입니다. 사용자의 인터랙션 등으로 인해 변경될 수 있는 모든 값은 State로 관리해야 합니다.
React의 핵심 원리: State가 변경되면, React는 해당 컴포넌트를 자동으로 다시 렌더링(Re-render)하여 화면을 업데이트합니다.
useState Hook: 함수형 컴포넌트에서 State를 사용할 수 있게 해주는 Hook입니다.
const [state, setStateFunction] = useState(initialState);state: 현재 상태 값.setStateFunction: 상태를 갱신하는 함수. 이 함수를 통해서만 상태를 변경해야 합니다. (직접 state = newValue 와 같이 수정하면 안 됨)initialState: 상태의 초기값.import React, { useState } from 'react';
function Counter() {
// count 상태를 0으로 초기화
// count: 현재 값(읽기용), setCount: 값을 변경하는 함수
const [count, setCount] = useState(0);
const increment = () => {
// setCount 함수를 호출하여 count 상태를 갱신 -> 리렌더링 발생
setCount(count + 1);
};
return (
<div>
<p>You clicked {count} times</p>
<button onClick={increment}>Click me</button>
</div>
);
}
상태 업데이트가 이전 상태 값에 의존하는 경우, 함수형 업데이트를 사용하는 것이 안전합니다.
이유: React의 상태 업데이트는 비동기적으로 처리될 수 있어, setCount(count + 1)을 여러 번 호출해도 마지막 한 번만 적용될 수 있습니다.
해결책: setState 함수에 값을 직접 넣는 대신, 최신 상태(previous state)를 인자로 받는 함수를 전달합니다.
const increment = () => {
// setCount에 이전 상태(prevCount)를 받아 새로운 상태를 반환하는 함수를 전달
setCount(prevCount => prevCount + 1);
};
React의 이벤트 처리는 HTML과 유사하지만, 몇 가지 차이점이 있습니다. 이를 통해 사용자의 행동(클릭, 입력 등)에 반응하여 컴포넌트의 상태(State)를 변경하고 UI를 동적으로 만들 수 있습니다.
주요 특징:
onclick 대신 onClick, onchange 대신 onChange와 같이 이벤트 이름은 카멜 케이스로 작성합니다.{} 안에 넣어 전달합니다.event.preventDefault() (기본 동작 방지), event.target.value (입력 값 접근) 등의 작업을 수행할 수 있습니다.function ColorChanger() {
const [color, setColor] = useState('black');
const changeColorHandler = () => {
setColor('red');
};
return (
<p
onClick={changeColorHandler} // 클릭 시 changeColorHandler 함수 실행
style={{ color: color }}
>
Click me to change my color!
</p>
);
}
HTML의 폼(Form) 요소(<input>, <textarea>, <select>)는 기본적으로 자기 자신의 상태를 내부적으로 관리합니다. 하지만 React에서는 폼 요소의 값을 컴포넌트의 State와 연결하여, React가 모든 데이터 흐름을 제어하도록 하는 방식을 권장합니다. 이를 "제어 컴포넌트"라고 합니다.
구현 방식:
state를 useState로 생성합니다.input과 같은 폼 요소의 value 속성에 이 state를 연결합니다.onChange 이벤트가 발생할 때마다, setState 함수를 호출하여 state를 업데이트합니다.장점:
state에 의해 관리되므로, 데이터 흐름이 예측 가능하고 일관됩니다.function NameForm() {
const [name, setName] = useState('');
const handleChange = (event) => {
setName(event.target.value);
};
return (
<form>
<label>Name:</label>
<input
type="text"
value={name} // 2. state를 value에 연결
onChange={handleChange} // 3. 변경 시 state 업데이트
/>
<p>Your name is: {name}</p>
</form>
);
}
useState)는 컴포넌트의 내부 데이터를 관리하며, 이 값이 변하면 화면이 자동으로 다시 렌더링됩니다.setState(prevState => ...) 형태의 함수형 업데이트를 사용하는 것이 안전합니다.onClick, onChange와 같은 카멜 케이스 속성에 함수를 직접 전달합니다.value, onChange를 연결하는 제어 컴포넌트 방식으로 관리하는 것이 표준입니다.