리액트

useMemo

kny_0 2022. 6. 9. 01:35

memo()

import { useState } from 'react'

function Child(){
  return <div>랜더링이 느린 컴포넌트</div>
}

function Number(){ 
  const [count, setCount] = useState(0)

  return (
    <Child />
    <button onClick={()=>{ setCount(count + 1) }}> + </button>
  )
}

버튼을 누를 때마다 <Child / >가 재렌더링 돼 비효율적이다.

 

import { memo, useState } from 'react'

let Child = memo( function(){
  return <div>랜더링이 느린 컴포넌트</div>
})

function Number(){ 
  const [count, setCount] = useState(0)

  return (
    <Child />
    <button onClick={()=>{ setCount(count+1) }}> + </button>
  )
}

memo로 해당 Child 컴포넌트를 감싸면 꼭 필요할 때만 재랜더링 되게 할 수 있다.

Child로 전송되는 propos가 변하거나 컴포넌트가 변화하는 경우에만 재렌더링이 된다.

 

memo로 감싼 컴포넌트의 기존 props와 바뀐 props를 비교하는 연산이 추가되므로 꼭 필요한 경우에만 사용한다.

 

useMemo()

import { useMemo } from 'react'

function operation(){
  return (오래 걸리는 연산)
}

function App(){ 
  const result = useMemo(()=>{ return operation() }, [])

  return <div>{result}</div>
}

useMemo()에 컴포넌트 로드시 1회만 실행하고 싶은 코드를 담는다.

시간이 오래걸리는 함수를 useMemo에 넣어두면 재렌더링마다 동작하지 않고 컴포넌트 로드시 1회만 실행된다. 

 

useEffect와 비슷하며 dependency도 넣을 수 있어 특정 state나 props가 변할 때만 실행도 가능하다.