Вопрос проверяет понимание механизма мемоизации в React и того, как useMemo сравнивает зависимости по ссылке, а не по значению.
Хук useMemo в React принимает функцию-фабрику и массив зависимостей. Он запоминает результат вызова функции и возвращает его при повторных рендерах, пока зависимости не изменятся. Сравнение зависимостей происходит с помощью Object.is, что означает строгое сравнение по ссылке для объектов и массивов.
Если вы передаёте в массив зависимостей объект, созданный прямо в теле компонента, то при каждом рендере создаётся новый объект с новой ссылкой. Например:
const MyComponent = () => {
const [count, setCount] = useState(0);
const options = { threshold: 0.5 };
const memoizedValue = useMemo(() => computeExpensiveValue(options), [options]);
// ...
};Здесь options создаётся заново при каждом рендере, поэтому useMemo видит новую ссылку и пересчитывает значение, игнорируя мемоизацию.
Чтобы мемоизация работала, нужно стабилизировать ссылку на объект. Это можно сделать с помощью useMemo или вынести объект за пределы компонента:
const OPTIONS = { threshold: 0.5 };
const MyComponent = () => {
const [count, setCount] = useState(0);
const memoizedValue = useMemo(() => computeExpensiveValue(OPTIONS), [OPTIONS]);
// ...
};Или с помощью useMemo для самого объекта:
const options = useMemo(() => ({ threshold: 0.5 }), []);
const memoizedValue = useMemo(() => computeExpensiveValue(options), [options]);Для эффективной мемоизации с useMemo необходимо, чтобы ссылки на объекты в массиве зависимостей оставались стабильными между рендерами. Иначе мемоизация теряет смысл, и вы получаете перерасчёт при каждом рендере.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию