계속 새롭게 정의되지 않는 그냥 변수들도 useMemo에 감싸주는걸까?
리렌더링 될 때마다, 계속 새로 만들어지는게 좋은 건 아닐지도 몰라.
자꾸 새로 만들지 말고, 메모해 놓는거 어때? => Memoization
메모리를 비우는 작업 => 가비지 컬렉션
이때, 멈춤 현상이 일어납니다. 메모리를 비우는 작업이 자주 일어날 수록 좋지 않겠죠.
const aaa = useMemo(() => Math.random(), []);
const aaa = useMemo(() => Math.random(), [countState]);
const onClickCountLet = useCallback(() => {
console.log(countLet + 1);
countLet += 1; // countLet = countLet + 1
}, []);
const onClickCountState = useCallback(() => {
console.log(countState + 1);
setCountState(countState + 1);
}, []);
const onClickCountState = useCallback(() => {
console.log(countState + 1);
setCountState(countState + 1);
}, []);
const onClickCountState = useCallback(() => {
// console.log(countState + 1);
setCountState(prev => prev + 1);
}, []);
prev를 사용해요.
const onClickCountState = useMemo(
() => () => {
console.log(countState + 1);
setCountState(countState + 1);
},
[],
);
부모 컴포넌트가 리렌더링 될 때마다 자식 컴포넌트도 리렌더링 되는 상황에 사용합니다.
import { memo } from "react";
function MemoizationChildPage() {
console.log("자식이 렌더링 됩니다!");
return (
<>
<div>=========================</div>
<h1>저는 자식 컴포넌트 입니다!!!</h1>
<div>=========================</div>
</>
);
}
export default memo(MemoizationChildPage);
import Word from "./02-child";
import { v4 as uuidv4 } from "uuid";
export default function MemoizationParentPage() {
const [data, setData] = useState("철수는 오늘 점심을 맛있게 먹었습니다");
const onClickChange = () => {
setData("영희는 오늘 저녁을 맛없게 먹었습니다");
};
return (
<>
{data.split(" ").map((el, index) => {
return <Word key={index} el={el} />; // 1. memo시, key 또는 el이 변경된 부분만 리렌더링 됨(즉, "오늘", "먹었습니다" 제외)
})}
{data.split(" ").map((el, index) => {
return <Word key={uuidv4()} el={el} />; // 2. memo를 해도, key 자체가 변경되어 props로 넘어가므로, 모두 리렌더링 됨
})}
<button onClick={onClickChange}>체인지</button>
</>
);
}
function Word(props: any) {
console.log("자식이 렌더링 됩니다!", props.el);
return (
<>
<span>{props.el}</span>
</>
);
}
export default memo(Word);
💥 모든 컴포넌트에 memo, useCallback을 사용했을 때의 문제점
💥 메모이제이션 쓰지 말아야할 때,
dependency array가 2개 이상 넘어가면 굳이 써야할까? 그냥 항상 refresh 되도록 하는 것이 유지보수 측면에서도 좋을 수 있다.
무조건 성능이 좋다고 좋은 건 아니다.
[참고 1]
[참고 2]
가비지 컬렉션 => 안쓰는 메모리 지워주기
언어에는 언매니지드언어(C, C++), 매니지드언어(Java, Python, JS)가 있다.
언매니지드언어는 가비지컬렉션 같은 작업을 직접 사람이 해줘야한다.
"지금 이 타이밍에 메모리 비워줘."와 같은 코드 작성해야한다.
따라서 불편하지만 효율은 높다.
매니지드언어는 직접 코드를 작성해줄 필요가 없어 편리하지만 효율은 떨어진다.
memo가 되지 않은 map의 uuid key 리렌더링 문제
uuid key를 사용하면 key값이 계속 변하기 때문에
메모이제이션 사용 사례 소개
관리자 페이지 테이블