찌우닝 2023. 2. 3. 12:43
Memoization 

컴포넌트가 리렌더링 되는 조건에는 state 변경, props 변경, 부모 컴포넌트 변경 3가지 조건이 있다.

그러나 리렌더링은 좋지 않다.

그러므로 리액트에서 불필요한 렌더링이 발생하지 않도록 최적화 하는게 중요!

 

 

1. memo(React.memo) : 컴포넌트를 캐싱 -> 부모 컴포넌트 변경

 : 컴포넌트를 메모이제이션

export default React.memo(Box1)

memo는 리액트 안에 있는 API로 import 해서 쓸 수 있다.

import {memo} from "react"

그러면 export default memo(Box1) 로 쓸 수도 있다는 말!

 

 

*무조건 쓰는게 아니라 자식 컴포넌트가 가벼운 변경이면 굳이 안써도 됨!

*props 변경이 많이 일어나는 컴포넌트라면 캐싱 처리 안하는게 좋다.

 

 

2. useCallback : 함수를 캐싱

 : 인자로 들어오는 함수 자체를 기억(모메이제이션)

자바스크립트에서 함수는 객체이므로 랜더링 될 때마다 다른 주소값으로 내용을 저장 하기 때문에

실질적으론 props가 변경이 된게 아니지만 주소값이 다르니 변경된걸로 받아들인다. 그래서 리렌더링이 일어남

이를 방지하기 위해 useCallback을 씀.

useCallback=(() => {

}, [])

 

 

3. useMemo : 값을 캐싱

: '객체, 배열, 함수' 기억!

동일한 값을 반환하는 함수를 계속 호출해야 하면 필요없는 렌더링을 하므로 맨 처음 해당 값을 반환할 때

그 값을 특별한 곳(메모리)에 저장!

그럼 필요할 때 마다 다시 함수를 호출하는 게 아니라 이미 저장한 값을 단순히 꺼내 쓰는 것

이러한 기법을 캐싱을 한다 라고 표현함

const value = useMemo(() => {
	return 반환할 함수()
}, [dependencyArray])

dependency Array의 값이 변경될 때만 반환할 함수()가 호출