일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ㅡ
- 문제해결
- accordian
- 조건부스타일
- 부모요소의 패딩 무시
- createPortal
- alias설정
- 제어컴포넌트
- parent padding
- twoarrow
- debouncing
- react
- Carousel
- ?? #null병합연산자
- transition
- 리액트
- 서초구보건소 #무료CPR교육
- CustomHook
- 함수형프로그래밍
- ignore padding
- useQueryClient
- 화살표2개
- 부모패딩
- tailwindCSS
- DOM
- vite
- BlockFormattingContext
- es6
- BFC
- QueryClient
Archives
- Today
- Total
프론트엔드 첫걸음
성능개선 - useMemo 로 데이터 저장 본문
App.js
import React, { useState, useCallback } from 'react';
import Button from './components/UI/Button/Button';
import DemoOutput from './components/Demo/DemoOutput';
import './App.css'
function App() {
const [listTitle, setListTitle] = useState('My List');
const changeTitleHandler = useCallback(() => {
setListTitle('New Title')
}, []);
return (
<div className="app">
<DemoList title={listTitle} items={ [5, 3, 1, 10, 9] }/>
<Button onClick={changeTitleHandler}> Change List Title! </Button>
</div>
)
}
DemeList.js
import React , { useMemo } from 'react'
import classes from './DemoList.module.css'
const DemoList = (props) = {
const sortedList = props.items.sort((a,b)=> a - b);
return (
<div className={classes.list}>
<h2>{props.title}</h2>
<ul>
{sortedList.map((item)=>{
<li key={item}>{item}</li>
})
</ul>
<div>
)
}
export default React.memo(DemoList);
Title이 바뀔때마다 sort 다시되는 것 고치고 싶어서 DemoList를 리액트메모로 감싸줬지만 -
DemoList에 props로 주는 배열은 객체이기때문에 부모컴포넌트 App이 재실행되면 메모리상에서 다른 위치에 새로 생성된다.
따라서 새로운 배열이 props로 전달되어 DemoList는 매번 다시 재정렬된다.
sort는 성능집약적 작업이다. [5 ,3, 1, 10, 9] 라는 같은 배열이 전달됐는데, 같은 배열로 매번 sort 되는 것은 비효율적이다.
useMemo 사용
App.js
App 에서 배열을 useMemo를 사용해 넘긴다.
<DemoList title={listTitle} items={ useMemo(() => [5, 3, 1, 10, 9] ,[])}/>
함수 외부로 빼와서 useMemo로 호출한 결과를 listItems에 저장하도록 함
import React, { useState, useCallback } from 'react';
import Button from './components/UI/Button/Button';
import DemoOutput from './components/Demo/DemoOutput';
import './App.css'
function App() {
const [listTitle, setListTitle] = useState('My List');
const changeTitleHandler = useCallback(() => {
setListTitle('New Title')
}, []);
const listItems = useMemo(() => [5, 3, 1, 10, 9] ,[]);
return (
<div className="app">
<DemoList title={listTitle} items={ listItems }/>
<Button onClick={changeTitleHandler}> Change List Title! </Button>
</div>
)
}
DemoList.js
DemoList 내에서 useMemo를 사용해 기존의 props의 item 으로 정렬한 리스트를 저장해놓고, 사용한다.
import React , { useMemo } from 'react'
import classes from './DemoList.module.css'
const DemoList = (props) = {
const { item } = props; //구조분해할당
const sortedList = useMemo (()=> {
return items.sort((a,b)=> a - b);
},[item])
return (
<div className={classes.list}>
<h2>{props.title}</h2>
<ul>
{sortedList.map((item)=>{
<li key={item}>{item}</li>
})
</ul>
<div>
)
}
export default React.memo(DemoList);
'개발 공부 > React' 카테고리의 다른 글
클래스 컴포넌트 Lifecycle (0) | 2022.08.05 |
---|---|
함수형 컴포넌트 class 컴포넌트로 바꾸기 (0) | 2022.08.04 |
useCallback으로 함수 재생성 방지하기 (0) | 2022.08.04 |
성능개선 - react.memo로 불필요한 재평가 방지하기 (0) | 2022.08.04 |
객체 타입의 prop 전개연산자로 전달하기 (0) | 2022.07.30 |