Иногда мы хотим сравнить старое и новое значение изменения состояния.

В этой статье мы рассмотрим, как преобразовать предыдущее значение состояния в новое.

Создайте свой собственный крючок

Мы можем получить старое значение состояния с помощью нашего собственного крючка.

Например, мы можем написать:

import { useEffect, useRef, useState } from "react";
const usePrevious = (value) => {
  const ref = useRef();
  useEffect(() => {
    ref.current = value;
  });
  return ref.current;
};
export default function App() {
  const [count, setCount] = useState(0);
  const prevCount = usePrevious(count);
  useEffect(() => {
    console.log(prevCount, count);
  }, [prevCount, count]);
  return (
    <div className="App">
      <button onClick={() => setCount((c) => c + 1)}>increment</button>
      <p>{count}</p>
    </div>
  );
}

Мы создаем ловушку usePrevious с параметром value, который является состоянием, из которого мы хотим получить предыдущее значение,

В ловушке мы создаем ссылку с ловушкой useRef для создания нереактивного свойства.

Затем мы добавляем хук useEffect с обратным вызовом, который устанавливает ref.current в value, чтобы установить предыдущее значение.

И мы возвращаем ref.current, который имеет предыдущее значение.

Теперь в App мы создаем состояние count, для которого хотим получить предыдущее значение.

Затем мы вызываем наш хук usePrevious с count, чтобы получить предыдущее значение count.

И мы наблюдаем за значением с помощью хука useEffect, чтобы зарегистрировать prevCount и count.

И мы смотрим значения, передавая prevCount и count во втором аргументе.

Ниже мы добавляем кнопку с параметром onClick, установленным для функции, которая вызывает setCount для увеличения счетчика.

И ниже мы показываем count.

Обратный вызов useEffect должен регистрировать значения prevCount и count, где prevCount должно быть предыдущим значением count.

Заключение

Мы можем наблюдать за предыдущим значением состояния, создавая собственный хук.