함수 컴포넌트는 그냥 함수이다. jsx를 반환할 뿐.
함수 컴포넌트가 렌더링 된다는 것은 누군가(부모 컴포넌트)가 그 함수를 호출하여 실행되는 것이다.
함수가 실행될 때 마다 내부에 선언되어 있던 표현식(변수 등)들도 매번 다시 계산된다.
컴포넌트는 자신의 state가 변경되거나, 부모에게서 받은 props가 변경되었을 때 아마 다시 렌더링 된다.
useMemo()
는 특정 결과값을 재사용 할 때 사용import React, { useMemo } from 'react';
useMemo는 첫 번째 인자로 콜백 함수를, 두 번째 인자로 의존성 배열을 받는다.
두 번째 인자인 배열의 요소 값이 업데이트될 때만 콜백 함수를 다시 호출해서 memoization 된 값을 업데이트 해줘서 다시 memoization을 해준다.
만약에 빈 배열([])을 넘겨주면 맨 처음 컴포넌트가 마운트 되었을 때만 값을 계산하고 이후에는 항상 memoization된 값을 꺼내 와서 사용한다.
const memoizedValue = useMemo(() => { return **콜백함수** },[ **의존성배열** ]);
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
값을 재활용하기 위해 따로 메모리를 소비해서 저장을 해놓기 때문에 불필요한 값을 모두 Memoization 해버리면 성능이 안 좋아질 수 있으니 꼭 필요할 때만 사용하도록 한다.
useCallback()
은 특정 함수를 새로 만들지 않고 재사용하고 싶을때 사용import React, { useCallback } from 'react';
useMemo는 첫 번째 인자로 콜백 함수를, 두 번째 인자로 의존성 배열을 받는다.
두 번째 인자인 배열의 요소 값이 업데이트될 때만 콜백 함수를 다시 호출해서 memoization 된 값을 업데이트 해줘서 다시 memoization을 해준다.
만약에 빈 배열([])을 넘겨주면 맨 처음 컴포넌트가 마운트 되었을 때만 값을 계산하고 이후에는 항상 memoization된 값을 꺼내 와서 사용한다.
const memoizedCallback = useCallback(
() => { **콜백함수** }, [ **의존성배열** ],
);
const memoizedCallback = useCallback(
() => { doSomething(a, b); }, [a, b],
);
값을 재활용하기 위해 따로 메모리를 소비해서 저장을 해놓기 때문에 불필요한 값을 모두 Memoization 해버리면 성능이 안 좋아질 수 있으니 꼭 필요할 때만 사용하도록 한다.
자식 컴포넌트에서 랜더링 최적화를 위한 별도의 코드(React.memo)를 추가하지 않으면, 부모에게서 받은 props가 변경되지 않았더라도 다시 리렌더링 된다.
useMemo()
와useCallback()
는 컴포넌트 내에서 값과 함수를 memoization 하고
React.memo()
컴포넌트 자체를 memoization 한다.
import React from 'react';
React.memo() 함수로 컴포넌트를 감싸준다.
React 컴포넌트 함수를 React.memo() 함수로 감싸주면 해당 컴포넌트 함수는 props 값이 변경되지 않는 한 다시 호출되지 않는다.
const MyComponent = React.memo(function MyComponent(props) {
/* props를 사용하여 렌더링 */
});