React에서 state는 컴포넌트 내에서 데이터와 UI 상태를 관리하는 변수. 컴포넌트 내부에서 바뀔 수 있는 값
state의 특징
React에서 state를 정의할 땐 useState()
hook을 사용
const [value, setValue] = useState(초기값);
불변성(immutability): 한 번 생성된 데이터는 직접 변경할 수 없다는 의미
React는 이전 state와 새로운 state의 메모리 주소를 비교하여 변경 여부를 감지
[...prev, newItem]
{ ...prev, key: value }
같은 입력값에 대해 항상 같은 출력값을 반환하고, 외부 상태나 변수에 영향을 미치치 않는 함수
// 순수 함수
function add(a, b) {
return a + b; // 입력(a, b)에 따라 항상 같은 결과
}
// 순수 함수 X
let count = 0;
function increment() {
count += 1; // 외부 상태(count)를 변경 → 부작용
return count;
}
컴포넌트: UI를 구성하는 단위체
렌더링 : 현재 props와 state 상태에 따라 UI를 그리는 작업
렌더링이 발생하는 조건은
명령형 프로그래밍 vs 선언형 프로그래밍
- 명령형 프로그래밍 : 무엇을 할지 뿐만 아니라, 어떻게 할지를 구체적으로 기술하는 방식
- 선언형 프로그래밍 : 무엇을 할지를 기술하고, 어떻게 할지는 시스템이나 언어가 알아서 처리하는 방식
// 명령형
const numbers = [1, 2, 3, 4];
const squared = [];
for (let i = 0; i < numbers.length; i++) {
squared.push(numbers[i] * numbers[i]);
}
console.log(squared); // [1, 4, 9, 16]
// 선언형
const numbers = [1, 2, 3, 4];
const squared = numbers.map(n => n * n);
console.log(squared); // [1, 4, 9, 16]
컴포넌트의 상태 관리를 가능하게 하는 hook.
const [count, setCount] = useState(0)
// state를 변경하는 방법
setCount(1)
setCount((prev) => prev + 1)
일반 업데이트 방식과 함수형 업데이트 방식의 차이는?
- 일반 업데이트 방법은 setState 함수가 여러개 있더라도 일괄적으로 처리 (불필요한 렌더링을 줄이기 위해 한번에 처리)
- 함수형 업데이트 방식은 setState 함수를 호출한 만큼 로직이 실행됨
함수형 업데이트 방식이 안정적인 것 같음
부수 효과(side effect)를 관리하기 위해 제공되는 hook
부수 효과(side effect
: UI를 그리는 순수 연산이 아닌, 외부 환경에 영향을 주거나 외부 상태를 참조/변경하는 작업
DOM 요소에 접근할 수 있도록 하는 hook, 데이터를 담아둘 때도 사용함
context API를 사용할 때 사용되는 hook
Provider에서 제공한 value가 달라진다면 해당 context를 구독하고 있는 모든 컴포넌트가 리렌더링 됨.
최적화를 위한 hook. 불필요한 렌더링이 발생하지 않도록 하여 최적화를 도움
리액트 컴포넌트가 생성되고 제거될 때 까지의 과정을 의미 Mount - Update - Unmount
DOM : 페이지를 구성하는 엘리먼트(컴포넌트)를 tree 형태로 표현한 것
Virtual DOM : 가상의 DOM, 실제 DOM 구조와 동일한 복사본