개발일기

React - useCallback 사용법 본문

Javascript/React.js

React - useCallback 사용법

Flashback 2024. 10. 3. 11:38
728x90
반응형

 

useCallback은 useMemo와 비슷하게 memoization하는 hook이지만 함수를 memoization한다는 점에서 useMemo와 차별점을 가지고 있다. React에서는 컴포넌트 안에 함수가 선언되어 있으면 컴포넌트가 리렌더링 될 때 함수들을 재생성하게 된다. 하지만 useCallback으로 감싸 memoization된 함수는 의존성 배열에 들어있는 변수 또는 함수가 변경되지 않은 이상 재생성되지 않는다. 즉 useMemo와 비슷한 개념으로 useCallbak은 기존 함수를 재사용할 수 있게 하는 hook이다.

 

useCallback의 형태

import { useCallback } from 'react' // useCallack 사용을 위해 useCallback import

// useCallback으로 함수를 감싸기
const memoizedFunction = useCallback(() => {
    ...
}, [deps]) // deps는 의존성 배열

기본적인 useCallback 사용법은 위와 같다. … 부분에 함수 내부 코드를 작성하면 되고 의존성 배열에 어떤 변수 또는 함수가 변경되었을 때 memoizedFucntion을 재생성 할 것인지를 추가하먼 된다.

 

useCallback을 사용하는 경우

  • 함수를 하위 컴포넌트에 props로 전달하는 경우
  • 자주 재생성되는 함수를 최적화 시키려고 하는 경우
  • useEffect 내에 사용되는 함수의 불필요한 재실행을 막기 위한 경우
// 상위 컴포넌트
const ParentComponent = () => {
    const [data, setDdata] = useState('')
    const handleClick = useCallback(() => {
        ...
        setData(...)
    }, []) // data값이 변경되면 함수 재생성
    
    // props로 함수 전달
    return <ChildComponent onClick={ handleClick } />
}

// 하위 컴포넌트
const ChildComponent = ({ onClick }) => {
    console.log('Child Component Render')
    
    return <button onClick={ onClick }>test</button>
}

위의 코드는 상위 컴포넌트에서 하위 컴포넌트로 handleClick이라는 함수를 전달하는 코드이다. handleClick이라는 함수는 data값을 변경하는 함수로 [] 의존성 배열에 아무 값을 넣지 않았기 때문에 최초에 한 번만 생성되는 함수다. 즉, 하위 컴포넌트가 리렌더링되도 handleClick이라는 함수는 재생성되지 않고 기존 함수를 그대로 사용하게 된다.

 

useEffect와 함께 사용하는 경우

const testComponent = () => {
    const [data, setData] = useState('')
    
    const testFunction = useCallback(() => {
        ...
    }, [data])
    
    useEffect(() => {
        testFunction()
    }, [testFunction])
    
    return <button onClick={ setData(...) }>test</button>
}

useEffect와 같이 사용하는 경우 위와 같다. 먼저 useEffect는 testFunction이라는 함수가 변경되었을 때 실행된다. 버튼을 클릭하면 data의 값이 바뀌는데 useCallback으로 감싸진 testFunction함수는 data값이 변경되면 함수를 재생성하도록 의존성 배열에 선언이 되어있다. 이와 같은 흐름으로 useEffect와 useCallback을 결합하여 사용할 수 있다.

 

useMemo와 결합하여 사용

또한 이외에도 useMemo와 useCallback을 결합하여 사용할 수 있다. 이 경우는 useMemo를 통해 memoization된 변수를 useCallback에서 사용하여 처리하는 함수일 경우에 결합하여 사용이 가능하다.

const [searchText, setSearchText]  useState('')

// userList에 값을 memoization
const userList = useMemo(() => {
    const data = list.filter((name => name.includes(searchText))) // 검색
    return data
}, [searchText])

// memoization된 userList를 testFunction에서 사용
const testFunction = useCallback(() => {
    ...
}, [userList])

memoization된 userList를 사용하여 testFunction에서 처리하고자 할 때 위와 같이 사용할 수 있다.


참고 사이트:

https://stackoverflow.com/questions/53159301/what-does-usecallback-usememo-do-in-react

 

What does useCallback/useMemo do in React?

As said in docs, useCallback Returns a memoized callback. Pass an inline callback and an array of inputs. useCallback will return a memoized version of the callback that only changes if one of the ...

stackoverflow.com

 

728x90
반응형
Comments