Проверяет понимание работы useEffect и useRef в React, а именно влияния ref-объектов на повторные вызовы эффектов.
В React хуки useRef и useEffect часто используются вместе, но их взаимодействие может вызывать путаницу. useRef возвращает объект с свойством current, который сохраняется между рендерами. Этот объект является стабильным — React всегда возвращает одну и ту же ссылку на него при каждом рендере. useEffect же принимает массив зависимостей и сравнивает их значения (для примитивов) или ссылки (для объектов) с предыдущими. Если ссылка на объект не изменилась, эффект не перезапускается.
Когда вы помещаете useRef() в массив зависимостей, вы передаете сам объект ref, а не его свойство current. Поскольку ссылка на объект всегда одинакова, React не видит изменений и не вызывает эффект повторно. Даже если вы измените ref.current, это не повлияет на сравнение зависимостей, потому что сравнивается ссылка на объект, а не его содержимое. Это фундаментальное отличие от состояния (useState), где изменение значения приводит к новому рендеру и пересмотру зависимостей.
import React, { useRef, useEffect } from 'react';
function Component() {
const countRef = useRef(0);
useEffect(() => {
console.log('Эффект выполнен');
}, [countRef]); // зависимость — объект ref
const increment = () => {
countRef.current += 1; // изменение current не вызовет эффект
};
return Увеличить;
}В этом примере при клике на кнопку countRef.current увеличивается, но эффект не будет вызван повторно, так как ссылка на объект countRef осталась прежней. Если бы вы использовали useState, изменение значения привело бы к повторному рендеру и, при необходимости, к вызову эффекта.
Такое поведение полезно, когда нужно хранить мутируемые данные, не вызывая лишних рендеров или эффектов. Например, для хранения предыдущего значения или для интеграции с внешними библиотеками, где требуется стабильная ссылка. Однако если вам нужно реагировать на изменения значения, используйте useState или передавайте ref.current в зависимости (но это не сработает, так как React не отслеживает изменения ref).
Использование useRef в зависимостях useEffect не приводит к повторным вызовам эффекта при изменении current. Это осознанное поведение React, которое позволяет избежать лишних операций. Применяйте это, когда нужно стабильное хранилище данных, не влияющее на жизненный цикл эффектов.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию