Первый верен:
setShow(s => !s);
Хотя второй работает в этом случае , он не верен:
// bad code
setShow(!show);
Почему?
Состояние установки является асинхронным, но на самом деле это означает, что состояние настройки откладывается до повторного рендеринга.
Пример:
const [myNum, setMyNum] = useState(0)
const handleUpdate = () => {
setMyNum(myNum + 1)
}
Если мы назовем handleUpdate
функция, новое значение myNum
увеличивается на 1. Это работает правильно, но как насчет этого:
const [myNum, setMyNum] = useState(0)
const handleUpdate = () => {
setMyNum(myNum + 1)
setMyNum(myNum + 1)
}
Вы можете подумать, что myNum
теперь 2, но это не так, это 1 .
Это происходит потому, что значение myNum
не изменяется до повторного рендеринга, поэтому вы, по сути, пишете следующее:
const handleUpdate = () => {
setMyNum(0 + 1)
setMyNum(0 + 1)
}
Вот почему вы должны всегда предоставляет функцию для установки состояния, если вы зависите от предыдущего значения .
Это работает правильно:
const handleUpdate = () => {
setMyNum(p => p + 1)
setMyNum(p => p + 1)
}
myNum
теперь равно 2.
Даже если вы устанавливаете значение только один раз, вы должны придерживаться хорошей практики. Когда ваше приложение становится сложным, и несколько разных действий могут установить состояние в любое время, вы не хотите, чтобы вас застали чем-то, что вы писали месяцы go, о которых вы никогда не думали, что это будет иметь значение.