function usePrevious(value) { const ref = useRef(undefined); // эффект выполняется ПОСЛЕ рендера и коммита, // поэтому во время рендера ref.current ещё хранит прошлое значение useEffect(() => { ref.current = value; }, [value]); return ref.current;}
Почему через useRef, а не useState
useRef хранит значение между рендерами, но его изменение не вызывает ререндер — именно то, что нужно.
Порядок важен: во время рендера мы возвращаем ref.current (старое значение), а useEffect обновляет его уже после коммита. Поэтому на следующем рендере вернётся значение предыдущего.
Если обновлять ref прямо в теле компонента, вы затрёте прошлое значение до того, как успеете его вернуть.