Проверяет понимание проблемы stale closure в useCallback и способов её решения без изменения массива зависимостей.
Stale closure — это ситуация, когда функция, созданная внутри хука (например, useCallback), запоминает значения переменных из того рендера, в котором была создана. Если эти переменные изменяются в последующих рендерах, колбэк продолжает использовать старые значения, что приводит к ошибкам.
Обычно для решения этой проблемы добавляют переменную в массив зависимостей useCallback. Однако это приводит к пересозданию функции при каждом изменении переменной, что может быть нежелательно для производительности или для стабильности ссылок (например, при передаче в мемоизированные дочерние компоненты).
Используйте useRef для хранения актуального значения. Создайте ref, обновляйте его в каждом рендере (например, через useEffect), и внутри колбэка обращайтесь к ref.current. Так колбэк всегда будет видеть свежее значение, но его ссылка останется стабильной.
const [count, setCount] = useState(0);
const countRef = useRef(count);
useEffect(() => {
countRef.current = count;
}, [count]);
const handleClick = useCallback(() => {
console.log(countRef.current); // всегда актуальное значение
}, []); // пустые зависимостиЭтот подход полезен, когда нужно передать стабильную функцию в мемоизированный компонент (React.memo) или в useEffect с пустыми зависимостями, но при этом функция должна использовать актуальные данные. Например, для обработчиков событий или подписок.
Использование useRef — это элегантный способ избежать stale closure без пересоздания функции. Он подходит для случаев, когда важна стабильность ссылки, но нужны свежие данные. Однако не злоупотребляйте им: если зависимостей мало и они редко меняются, проще добавить их в массив зависимостей.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию