Вызов состояния набора один за другим полностью в порядке, и здесь все правильно:
const handleClick = () => {
if (!isOnline) {
setIsOnline(!isOnline)
setCount(count + 1)
} else {
setIsOnline(!isOnline)
}
}
Состояние обновляется асинхронно, что означает, что ваши переменные состояния isOnline
и count
don на самом деле не меняется, пока ваш компонент не рендерится. Вызов setCount
и setIsOnline
не обновляет эти переменные, но говорит React обновить при следующем рендере.
Вот почему вы не можете сделать что-то подобное:
const handleClick = () => {
setCount(count + 1)
setCount(count + 1)
}
Счет будет увеличен на 1, а НЕ на 2.
Почему?
Поскольку значение count
еще не обновлено, так как мы должны подождать до повторной визуализации, прежде чем это обновляется. Это означает, что count
имеет одно и то же значение на протяжении всего пути через функцию - оно никогда не меняется. Таким образом, вы можете вызывать setCount(count + 1)
миллион раз, и значение будет увеличиваться только на 1.
Это то, что люди имеют в виду, когда говорят, что вы должны использовать функцию обратного вызова установленного состояния.
Это является функцией обратного вызова установленного состояния:
const handleClick = () => {
setCount(prev => prev + 1)
setCount(prev => prev + 1)
}
Это работает как ожидалось, и count
теперь будет увеличено на 2.
Если мы передадим функцию, подобную этой prev => prev + 1
, чтобы установить состояние, React будет передавать самое последнее значение в функцию.
Правило:
Каждый раз, когда вы используете старое значение состояния для установки нового значение состояния - передайте функцию для установки состояния.
Так что, хотя ваша текущая реализация работает, вы действительно должны передать функцию для установки состояния на count
, поскольку вы зависите от предыдущего состояния:
const handleClick = () => {
if (!isOnline) {
setIsOnline(!isOnline)
setCount(prev => prev + 1)
} else {
setIsOnline(!isOnline)
}
}
Обычно вы должны делать это и для своего логического значения, например:
setIsOnline(prev => !prev)
, но так как вы используете isOnline
в своем операторе if, вы не должны делать что здесь значение prev
может отличаться от v alue ваш if
использует.