Если новое состояние вычисляется с использованием предыдущего состояния, вы можете передать функцию в setState. Функция получит предыдущее значение и вернёт обновлённое значение.
// counter = 0
setCounter(() => counter + 1)
setCounter(() => counter + 1)
// почему тут 1 ?
// -------------------------------
setCounter(prev => prev + 1)
setCounter(prev => prev + 1)
// почему тут 2 ? Откуда второй вызов setCounter знает, что над
// стейтом уже были манипуляции и у него новое значение?