-
Notifications
You must be signed in to change notification settings - Fork 1
렌더링 최적화 2탄: 잘못된 custom hook 사용,, 전체 리렌더링을 부르다,,
Soobeen Yoon edited this page Dec 14, 2022
·
2 revisions
- useTodoList.tsx에서 모든 상태(todoList,
displayTime등)을 가지고 있었고, 이를 Main에서 받아서 자식 컴포넌트에 내려주는 방식이었다. - custom Hook은 사용하는 컴포넌트마다 custom hook이 가지는 state, effect는 완전히 독립적이기 때문에 Main 하위의 모든 컴포넌트가 같은 상태를 가질 수 없을 수도 있겠다는 생각이 들어서 props로 내려주게 되었다.
Do two components using the same Hook share state?
No. Custom Hooks are a mechanism to reuse stateful logic (such as setting up a subscription and remembering the current value), but every time you use a custom Hook, all state and effects inside of it are fully isolated.
- 따라서, 재생버튼을 눌러서 소요시간을 보여주는
displayTime이 1초에 한 번 변경되면 페이지 전체가 리렌더링되는 문제가 발생했다.
- Jotai, useMemo, React.memo를 활용하여 소요시간에 영향을 받는 부분만 렌더링되도록 설정
- 리렌더링 문제를 해결하기 위해 설계된 Jotai 라이브러리를 활용해보기로 했다.
-
setTimerAtom를 활용하여 timer를 제어하는 부분을 props로 내릴 필요 없이, 컴포넌트 단에서 호출하여 사용할 수 있도록 수정.
-
- 이에 따라, Main에서 props로 내려주는 각종 상태를 가지고 있는 불필요한 useTodoList hook을 지울 수 있었음.
export const globalTimerAtom = atom(-1);
export const setTimerAtom = atom(
(get) => get(globalTimerAtom),
(get, set) => {
const timer = get(globalTimerAtom);
if (timer === -1) {
set(
globalTimerAtom,
window.setInterval(() => {
set(elapsedTimeAtom, get(elapsedTimeAtom) + 1);
}, 1000),
);
set(isOnProgress, 'working'); // start
return;
}
clearInterval(timer);
set(globalTimerAtom, -1);
set(isOnProgress, 'relaxing'); // stop
},
);
export const stopTimerAtom = atom(null, (get, set) => {
const timer = get(globalTimerAtom);
if (timer !== -1) {
clearInterval(timer);
set(globalTimerAtom, -1);
set(isOnProgress, 'relaxing'); // stop
}
});
- Rendering Duration 35% 개선 (timer 움직일 때
displayTime변경되는 동일 시점 비교)
- Timer를 시작하는 atom과 Timer를 멈추는 Atom으로 어플리케이션 전역에서 타이머를 제어할 수 있게 되어서, 추후 다른 페이지에서 Timer를 제어할 수 있도록 기능을 확장하기 쉬워져서 좋았던 것 같다.
- OaO 환경설정 A to Z
- CRLF 너가 뭔데 날 힘들게 해?
- Github Issue 똑똑하게 사용하기
- OAO! CI CD 적용기 with release 자동화
- 매번 다른 import문
- 못생긴 상대경로에서 간zlzl존 절대경로로😎
- TodoList API 개발기
- 의존성 주입으로 DB를 바꿔보자
- 렌더링 최적화 서막: useNavigate를 추가한 순간 리렌더 범위가 확장된 건에 대하여
- 렌더링 최적화 1탄: 렌더링 범위에 대하여 (by 최적화무새)
- 렌더링 최적화 2탄: 잘못된 custom hook 사용,, 전체 리렌더링을 부르다,,
- 렌더링 최적화 3탄: Todo 상세 좀 봤다고 테이블 전체가 재렌더링 되는건을 고치기😌
- 렌더링 최적화 4탄: 다이어그램 편
- 🐁 마우스 상대위치 계산은 이상해
- React 컴포넌트에 애니메이션을 적용해보자 🏃🏻💨
- 컴포넌트 재사용성을 높여보자: Modal 분리기 🌹
- 선후관계를 자동완성으로 추가해보자 🔎