일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- BFS
- network core
- 리액트최적화
- LazyVGrid
- 페이지전환
- GridItem
- react-router-dom
- @published 프로퍼티 래퍼
- @observedobject 프로퍼티 래퍼
- 동기 함수 내에서 비동기 함수 호출
- 컴퓨터네트워크
- featured-sliced-design
- 가로모드끄기
- 페이지이동함수
- react hook
- 반응형 css
- 블로그업로드확인
- 비동기함수
- SwiftUI Font
- CSS
- 세로모드끄기
- navigationBar 숨기기
- LazyHGrid
- physical media
- @environmentobject 프로퍼티 래퍼
- 리렌더링최적화
- access network
- react fsd
- C++
- 상단 빈공간 제거
- Today
- Total
leebaek
[React] 리렌더링 최적화 1편 : React.memo 본문
■ React 최적화 - 리렌더링 최적화를 위해서 !
■ React.memo
■ 예시 코드
■ React 최적화 - 리렌더링 최적화를 위해서 !
React에서 컴포넌트는 상태나 props가 바뀔 때 리렌더링 됩니다.
이때 컴포넌트 안에서 정의된 함수가 익명함수인지, 기명 함수인지에 따라 달라지는게 있을까요 ??
익명 함수 기명 함수 둘다 ! 차이는 없다 ..
- 렌더될 때 마다 함수 새로 생성 → 참조값이 달라짐 !!!
- 부모가 렌더링 되면, 자식에게 전달된 함수 props도 항상 새로움 !
→ 즉, 불필요한 리렌더링 발생
function MyComponent() {
return (
<button onClick={() => console.log("clicked!")}>Click</button>
);
}
function MyComponent() {
const handleClick = function handleClick() {
console.log("clicked!");
};
return <ChildComponent onClick={handleClick} />;
}
🧐 어떻게 리렌더링을 최적화 하나요 ??
우선 memo에 대해 알아봅시다.
■ React.memo
: 컴포넌트 자체를 메모이제이션하는 고차 컴포넌트
- props가 변경되지 않으면 리렌더링을 하지 않도록 막아주는 최적화 기법
이전 props와 새로운 props를 얕은 비교(shallow comparsion) 해서 같으면 렌더링을 건너뛰는데요!
이때, 얕은 비교가 무엇인지 알아야 memo에 대해 더 잘 이해할 수 있어요. 😙
타입 | 얕은 비교 방식 | 결과 |
원시값(number, string, boolean) | 값 자체 비교 | 값이 같으면 true |
참조형(object, array, function) | 참조(주소) 비교 | 같은 객체 참조면 true, 아니면 false |
함수의 내용은 같아도 생성될 때마다 참조값이 달라지니 memo로는 최적화가 힘들것 같네요.
→ 자식 컴포넌트 props에 함수가 있다면 memo 효과 없음
→ why? 함수 생성시 참조값이 달라지기 때문에 props가 변하였다고 인지!!
■ 간단한 예시를 통해 비교해볼까요 ~ ?
ex1 ) props가 원시값인 경우
부모 컴포넌트에서 버튼을 눌러 리렌더될 때,
자식 컴포넌트의 props가 변하지 않았으므로 memo로 컴포넌트 자체 메모이제이션 가능
import React from 'react';
import { useState } from 'react';
const Child = React.memo(({ count }) => {
console.log('Child rendered');
return <div>Child Count: {count}</div>;
});
function Parent() {
const [ParentCount, setParentCount] = useState(0);
return (
<div>
<button onClick={()=>setParentCount((prev)=> prev+1)}>
Parent Count: {ParentCount}
</button>
<Child count={10}} />
</div>
);
}
ex2 ) props가 원시값 + 함수일 경우
부모 컴포넌트에서 버튼을 눌러 리렌더될 때,
자식 컴포넌트의 props 함수가 새로 생성되므로 memo로 컴포넌트 자체 메모이제이션 불가능
- 의도치 않은 동작으로 Child rendered 출력됨
import React from 'react';
import { useState } from 'react';
const Child = React.memo(({ count, onClick }) => {
console.log('Child rendered');
return (
<div>
<button onClick={onClick}>
Child Count: {count}
</button>
</div>;
);
});
export default function App() {
const [ChildCount, setChildCount] = useState(0);
const [ParentCount, setParentCount] = useState(0);
return (
<div>
<button onClick={()=>setParentCount((prev)=> prev+1)}>
Parent Count: {ParentCount}
</button>
<Child count={ChildCount} onClick={()=>setChildCount((prev)=> prev+1)} />
</div>
);
}
memo는 얕은 비교로 동작한다는 것, 그래서 props가 함수일 경우 memo는 효과가 없다는 것을 알게 되었습니다 !
다른 원시값들은 메모이제이션이 가능하니 리렌더링 최적화가 되겠군요 😙
이어지는 포스팅에서는 props가 함수, 객체, 배열일 경우 리렌더링 최적화 하는 방법에 대해 알아보도록 해요 ☀️
'웹 > React' 카테고리의 다른 글
[React] 리렌더링 최적화 3편 : useMemo Hook (0) | 2025.04.11 |
---|---|
[React] 리렌더링 최적화 2편 : useCallback Hook (2) | 2025.04.05 |
[React] 리액트 폴더 구조 2편 - Feature-Based Structure (0) | 2025.03.27 |
[React] 리액트 폴더 구조 1편 - Featured-Sliced-Design (0) | 2025.03.27 |
[React] props에 대해 알아보자 (0) | 2025.03.23 |