현재의 문제.
1개를 삭제해도 나머지 일기들이 모두 리랜더링 되고있다.
나중에 몇 백 몇 천 몇 십만장이 있다고 생각하면 메모리낭비가 심하게 될거라는걸 알 수있음
export default React.memo(DiaryItem);
일단 DiaryItem을 React.memo 로 묶어서 최적화작업을 시작 해주었다.
그다음 useEffect를 활용해서 어떤 아이템들이 리랜더링 되는지 확인
useEffect(() => { console.log(`${id}번 째 아이템 랜더!`) })
const [isEdit, setIsEdit] = useState(false);
const toggleIsEdit = () => setIsEdit(!isEdit);
DiaryItem 컴포넌트 중 onEdit, onRemove는 Data state가 변화하면 재생성 되어야 하는 함수이기 때문에 onCreate최적화 방법과 똑같이 useCallback을 사용해 함수형 업데이트를 할 것이다
const onRemove = (targetId) => {
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
const onRemove = useCallback((targetId) => {
setData(data => data.filter((it) => it.id !== targetId));
}, []);
const onEdit = (targetId, newContent) => {
setData(
data.map((it) => it.id === targetId ? { ...it, content: newContent } : it)
)
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
const onEdit = useCallback((targetId, newContent) => {
setData(
(data) =>
data.map((it) => it.id === targetId ? { ...it, content: newContent } : it)
)
}, []);
useCallback 추가 후 삭제나 수정을하면 .
전체가 아니라 해당되는 부분의 data state만 랜더링 되는걸 확인 할 수 있다
참고:
- 한 입 크기로 잘라먹는 리액트
반응형
'개발 > Javascript' 카테고리의 다른 글
[Javascript] setTimeout, clearTimeout, setInterval, clearInterval (3) | 2022.07.22 |
---|---|
[React] 상태변화 로직 분리하기 (0) | 2022.07.21 |
[React] 최적화3 - 컴포넌트 최적화 (0) | 2022.07.19 |
[Javascript] 숫자 출력 함수 / 나머지 매개변수 (0) | 2022.07.19 |
[React] 최적화2 - 컴포넌트 재사용 (0) | 2022.07.14 |