console.log
메세지가 출력된다.)// 부모 컴포넌트
function Parent() {
const [count, setCount] = useState(0);
const addCount = () => {
setCount(count + 1);
};
return (
<div>
<h1>부모 컴포넌트입니다.</h1>
<Child />
</div>
);
}
export default Parent
// 자식 컴포넌트
function Child() {
console.log("업데이트 되었습니다");
return (
<div>
<h1>자식 컴포넌트 입니다.</h1>
</div>
);
}
export default Child
console.log
가 출력되지 않음)// 부모 컴포넌트
function Parent() {
const [count, setCount] = useState(0);
const addCount = () => {
setCount(count + 1);
};
return (
<div>
<h1>부모 컴포넌트입니다.</h1>
<h3>{count}</h3>
<Child />
</div>
);
}
export default Parent
// 자식 컴포넌트
function Child() {
console.log("업데이트 되었습니다");
return (
<div>
<h1>자식 컴포넌트 입니다.</h1>
</div>
);
}
// 컴포넌트를 React.memo로 감싸주면 끝
export default React.memo(Child)
memoization
하는 것initCount
함수가 재생성 되기 때문에JS에서 함수는 일급'객체'로 취급되는데
객체는 메모리 공간 속 별도의 공간에 주소값으로 저장된다.
따라서 재렌더가 일어나면새로운 주소값
에 이전 함수와 똑같이 생긴 함수가 저장되고
React는 기존의 함수와 똑같은 함수라도새로운 함수로 인지
하고 재렌더가 발생한다.
// 부모 컴포넌트
function Parent() {
const [count, setCount] = useState(0);
const addCount = () => {
setCount(count + 1);
};
const initCount = () => {
setCount(0);
}
return (
<div>
<h1>부모 컴포넌트입니다.</h1>
<h3>{count}</h3>
<Child setCount={setCount}/>
</div>
);
}
export default Parent
// 자식 컴포넌트
function Child({setCount}) {
console.log("업데이트 되었습니다");
return (
<div>
<h1>자식 컴포넌트 입니다.</h1>
<button onClick={setCount}>초기화</button>
</div>
);
}
export default React.memo(Child)
// 부모 컴포넌트
function Parent() {
const [count, setCount] = useState(0);
const addCount = () => {
setCount(count + 1);
};
// 함수를 useCallback으로 감싸준다
const initCount = useCallback(() => {
setCount(0);
}, [])
return (
<div>
<h1>부모 컴포넌트입니다.</h1>
<h3>{count}</h3>
<Child setCount={setCount}/>
</div>
);
}
export default Parent
// 자식 컴포넌트
function Child({setCount}) {
console.log("업데이트 되었습니다");
return (
<div>
<h1>자식 컴포넌트 입니다.</h1>
<button onClick={setCount}>초기화</button>
</div>
);
}
export default React.memo(Child)
function HeavyWork() {
// 무거운 함수
const heavyFunc = () => {
for (let i = 0; i < 10000000000; i++) {
return 100;
}
};
// 무거운 함수를 재렌더마다 실행
const value = useMemo(() => heavyFunc(), []);
console.log(`value는 ${value}입니다`);
return (
<div>
<h1>{value}</h1>
</div>
);
}
export default React.memo(Child);
function Test() {
const [isAlive, setIsAlive] = useState(false);
// 불변성을 유지해야 하는 객체
// 특정 값이 변경될 때가 아니라면 현재의 주소값을 유지한다.
const person = useMemo(() => {
return {
name: "Lee",
age: "21",
isAlive: isAlive ? "생존" : "사망",
};
}, [isAlive]);
return (
<div>
<h1>{value}</h1>
</div>
);
}
export default React.memo(Child);