memo
- 불필요한 렌더링을 줄이기 위해
memo
를 사용한다.
react
에서 제공하고 있다.
import {memo} from "react"
const MemoizationPresenterPage = ()=>{
console.log("프리젠터가 렌더링 됩니다.")
return(
<div>
<div>================<div>
<h1>이것은 프리젠터 입니다.</h1>
<div>================<div>
</div>
)
}
export default memo(MemoizationPresenterPage)
- 이렇게
memo
를 사용해주시고 state카운트
를 클릭해보시면 프리젠터는 렌더링이 되지않아 콘솔도 찍히지 않을 뿐더러 리액트 툴에도 보이지 않는다.
useCallback(), useMemo()
- 자식컴포넌트는
memo
를 사용해 불필요한 리렌더가 더이상 일어나지 안도록 막아주었지만, 부모 컴포넌트는 지속적으로 렌더링이 일어나는 상태이다.
- 하지만 부모컴포넌트에서도 부분적으로 렌더링이 일어나지 않아도 되는 부분이 있다.
- 예를들어
stateCount
를 변경했을때 letCount
의 값이 지속적으로 다시 만들어지고 있는 상황이다. (초기화라고 하지만 0이라는 값이 계속 다시만들어 지는 것.)
- 따라서 이런 불필요한 값들이 지속적으로 다시 만들어지지 않도록 유지시켜주는
hooks
가 바로 useMemo()
, useCallback()
이다.
useMemo() 사용방법
import {useMemo} from 'react'
const containerPage = ()=>{
console.log("컨테이너가 렌더링 됩니다.")
let countLet = 0
const [countState,setCountState] = useState(0)
const memo = useMemo(()=>{
return Math.random()
},[])
console.log(`${memo}는 더이상 안 만들어`)
const onClickCountLet = ()=>{
console.log(countLet+1)
countLet += 1
}
const onClickCountState = ()=>{
console.log(countState+1)
setCountState(countState+1)
}
return(
<div>
<div>================<div>
<h1>이것은 컨테이너 입니다.</h1>
<div> 카운트(let): {countLet} </div>
<button onClick={onClickCountLet}> 카운트(let) +1 올리기! </button>
<div> 카운트(state): {countLet} </div>
<button onClick={onClickCountState}> 카운트(state) +1 올리기! </button>
<div>================<div>
<MemoizationPresenterPage/>
</div>
)
}
export default containerPage
- 일반적으로 useMemo의 사용은 굉장히 복잡한 계산이외에는 그렇게 흔하지는 않다.
useCallback() 사용법
import {useCallback} from 'react'
const containerPage = ()=>{
console.log("컨테이너가 렌더링 됩니다.")
let countLet = 0
const [countState,setCountState] = useState(0)
const onClickCountLet = useCallback(()=>{
console.log(countLet+1)
countLet += 1
},[])
const onClickCountState = useCallback(()=>{
console.log(countState+1)
setCountState(countState+1)
},[])
return(
<div>
<div>================<div>
<h1>이것은 컨테이너 입니다.</h1>
<div> 카운트(let): {countLet} </div>
<button onClick={onClickCountLet}> 카운트(let) +1 올리기! </button>
<div> 카운트(state): {countLet} </div>
<button onClick={onClickCountState}> 카운트(state) +1 올리기! </button>
<div>================<div>
<MemoizationPresenterPage/>
</div>
)
}
export default containerPage
- useCallback으로 함수를 감싸주게 되면 해당 함수를 다시 불러오지 않고 이전에 불러왔던 함수를 실행시키게 된다.
- 즉, 이전에 불러왔던 값을 유지시는 것.
- 이렇게 함수는 다시불러오지 않지만 값은 올려주고 싶을 때 사용할 수 있는 방법은 prev를 이용하는 것이다.
setCountState((prev)=>prev+1)
이렇게 setCoutState
함수를 작성해주면 onClickCountState 함수를 새로 그리지 않지만, state는 올려줄 수 있다.