Краткий ответ - нет.
Оба используются для оптимизации производительности в отношении уменьшения ненужного повторного рендеринга, но React.memo
и useMemo
используются для двух разных сценариев ios ...
React.memo является HOO C и информирует реакцию для выполнения поверхностного сравнения пропущенных пропов, чтобы определить, следует ли повторно выполнить рендеринг.
https://reactjs.org/docs/react-api.html#reactmemo
Пример:
export const Component = React.memo(({name}) => `Hello ${name}`)
Здесь реагирует на поверхностное сравнение и будет повторно отображаться только в случае изменения имени.
useMemo - это ловушка, используемая для запоминания значения. React будет только переоценивать значение, только если зависимости (второй аргумент useMemo
) изменятся. Есть правила с крючками, которые должны соблюдаться.
https://reactjs.org/docs/hooks-reference.html#usememo
Пример:
export const MyComponent = ({firstName, lastName, age}) => {
const fullName = useMemo(() => `${firstName} ${lastName}`, [firstName, lastName]);
return <Profile fullName={fullName} />
}
Вы может взломать useMemo, чтобы сделать что-то вроде React.memo, но он не предназначен для такого использования.
useCallback Существует также хук useCallback
, который часто используется с React.memo
.
Если ваш родительский компонент передает обратный вызов дочернему элементу, заключенному в React.memo
, будет хорошей идеей создать обратный вызов с использованием useCallback
, в противном случае дочерний элемент будет в любом случае повторно визуализирован из-за повторного обратного вызова -создан каждый раз, когда родительский объект повторно визуализируется.
useCallback
также принимает массив зависимостей, например useMemo
, чтобы его можно было создать заново при изменении зависимости.
https://reactjs.org/docs/hooks-reference.html#usecallback
Пример:
export const MyComponent = ({firstName, lastName, age}) => {
const handleClick = useCallback((e) => {
e.preventDefault();
// doSomething
}, []);
return <Profile onClick={handleClick} />
}
const Profile = React.memo((onClick) => (
<button onClick={onClick)>Click me!</button>
));