함수 컴포넌트는 그냥 함수이다. 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를 사용하여 렌더링 */
});