
형제 컴포넌트인 Viewer와 Controller는 서로의 state(count, setCount)에 직접 접근하거나 공유할 수 없다.

이럴 때 App이라는 부모 컴포넌트에서 자식 컴포넌트, 단방향으로 데이터를 공유할 수 있다.
App
├ Viewer
└ Controller
Viewer → count 전달
Controller → setCount 전달
처럼 React에서는 부모 → 자식 방향으로만 데이터가 전달되는데 이를 단방향 데이터 흐름 이라고 한다.
이렇게
state를 공통 부모 컴포넌트로 올려서 여러 자식이 공유하게 하는 것
을 State Lifting(State 끌어올리기) 이라고 함

React 컴포넌트는 생성되고(Mount), 변경되며(Update), 제거되는(Unmount)
생명주기(Life Cycle)를 가짐
컴포넌트가 state나 props 변경으로 다시 렌더링 되는 순간
리렌더링 될 때를 의미
다음과 같은 상황일 때 발생
| 동작 | 사이드 이펙트 |
|---|---|
| Mount | console.log("Mount") |
| Update | console.log("Update") |
| Unmount | console.log("Unmount") |
// 예시
useEffect(() => {
console.log("Mount")
return () => {
console.log("Unmount")
}
}, [])
| 형태 | 실행 시점 |
|---|---|
| 없음 | 렌더링마다 실행 |
| [] | Mount 시 한번 실행 |
| [state] | state 변경 시 실행 |
// 매 렌더링마다 실행
useEffect(() => {
console.log("render")
})
// mount 한번만
useEffect(() => {
console.log("mount")
}, [])
// 특정 값 변경 시
useEffect(() => {
console.log("count update")
}, [count])
useEffect에서 return으로 전달하는 함수다음 상황에서 실행됨
주로 아래 같은 작업을 정리할 때 사용됨
useEffect(() => {
const id = setInterval(() => {
console.log("running")
}, 1000)
// cleanup
return () => {
clearInterval(id)
}
}, [])
useEffect는 컴포넌트가 렌더링 된 이후 실행됨보통 아래와 같은 작업을 처리할 때 사용됨
useEffect(() => {
fetch("/api/data")
.then(res => res.json())
.then(data => console.log(data))
}, [])