Myalog/Study
[유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 - 사전직무교육 Day 6
myalog
2024. 9. 2. 07:43
사전직무교육 Day6
오늘은 사전직무교육 여섯째날이다
얼른 퇴원해서 오프라인으로 교육 듣고싶다😭😭
⚙️ React Hooks
useEffect
- 컴포넌트의 생명주기를 관리하기 위한 Hook
- 컴포넌트 생명주기
- 컴포넌트 생성
- 컴포넌트 삭제 (clean up 함수 활용)
- 컴포넌트 업데이트 (상태 값 변경)
useEffect(() => { ... },[의존성 배열])
- 첫번째 인자에는 콜백함수, 두번째 인자에는 의존성 배열을 넣어 사용
- 리액트에서는 컴포넌트가 생성될 때 호출하기 위해 데이터 페칭, API 통신을 할때 가장 많이 사용되는 Hook
- 상태 끌어올리기 (state lifting)
- 하위 컴포넌트에 작성된 state를 상위 컴포넌트로 끌어올리는 것
- 상위 컴포넌트에서 로직을 작성해야하는 경우 상태를 끌어올려야 동일한 상태 값을 공유할 수 있음
- darkmode, imagepreloader 등에서도 많이 쓰임
// 유저의 다크모드 환경을 체크
useEffect(()=>{
const userPrefersDark = window.matchMedia(
"(prefers-color-scheme: dark)"
).matches;
setIsDarkmode(userPrefersDark);
},[])
// imagePreloader
// 초기 렌더링 경험을 개선하기 위해 많이 사용됨
function useImagePreloader(images: string[]){
useEffect(()=>{
images.forEach((image)=>{
const img = new Image();
img.src = image
})
},[images])
}
useImagePreloader([Seoul, London, ...])
useLayoutEffect
- 화면에 컴포넌트가 생성될 때 실행되는건 맞지만, 컴포넌트를 화면에 그리기 바로 전에 동기적으로 코드를 처리하는 Hook
- 따라서 코드가 종료될 때까지 다른 코드가 작동되지 않음
- 데이터 통신은 useEffect Hook을 사용하고, 단순히 레이아웃이 변경될 때는 useLayoutEffect Hook을 많이 사용함
useTransition
- React 18 버전에서 출시된 Hook 중 하나
- 동시성 모드 훅에 포함됨
- 컴포넌트 내 로직때문에 컴포넌트 전체가 부하가 걸릴 경우, 부하를 줄일 수 있도록 사용하는 Hook
- React에서보다는 Next.js에서 가장 많이 사용되는 Hook
const [pending, startTransition] = useTransition();
// startTransition 함수에 부하가 걸리는 코드를 맵핑
// 내부에 있는 코드의 우선순위를 낮춰주어 컴포넌트의 부하를 줄여줌 -> 내부 로직 코드가 비동기처럼 실행되게 함
startTransition(() => {
....
});
// View 코드
{!pending ? (
<ul>
...
</ul>
) : (
<p>loading</p>
)}
- input의 onChange 이벤트에서 성능을 최적화하기 위해 사용되는 디바운스와는 달리 연속으로 입력하는만큼 DOM 요소를 새롭게 생성하고, 렌더링을 반복함
- 디바운스(Debounce)
- input 컴포넌트에 사용자가 요소를 입력할때마다 onChange 이벤트가 발생하게되고, 그 때마다 컴포넌트가 업데이트 되면서 리렌더링이 계속해서 일어나 성능이 저하됨
- 따라서 사용자가 특정 시간동안 입력이 끝날때까지를 기다렸다가 입력이 끝났음을 인식하고 렌더링을 시켜 성능을 최적화
- 또는 이벤트가 발생되는 컴포넌트를 최대한 하위 컴포넌트로 분리하여 상위 컴포넌트의 리렌더링을 방지
- 디바운스(Debounce)
본격적으로 데이터 페칭과 관련된 Hooks를 배우면서 지난 프로젝트들에서 활용했던 것들을 다시 상기하며 내가 놓치고 있는 부분들을 파악할 수 있었다.
내일도 화이팅하자!! 😇
본 후기는 본 후기는 [유데미x스나이퍼팩토리] 프로젝트 캠프 : React 2기 과정(B-log) 리뷰로 작성 되었습니다.