В прошлом нас явно предупреждали, что вызов setState({myProperty}) является асинхронным, и значение this.state.myProperty недействительно до обратного вызова или до следующего метода render().
Как с помощью useState получить значение состояния после его явного обновления?
Как это работает с крючками? Насколько я могу судить, функция установки useState не принимает обратный вызов, например
const [value, setValue] = useState(0);
setValue(42, () => console.info('hi callback');
не приводит к запуску обратного вызова.
Другой способ решения проблемы в старом мире - повесить переменную экземпляра (e.g. this.otherProperty = 42) на класс, но здесь это не работает, поскольку нет экземпляра функции для повторного использования (нет this в строгом режиме).
Вы можете использовать useState с функцией обратного вызова. Это не предусмотрено по умолчанию, но помогает этот настраиваемый хук: github.com/the-road-to-learn-react/use-state-with-callback
Функция установки useState действительно принимает обратный вызов, как описано здесь: reactjs.org/docs/hooks-reference.html#functional-updates Был ли этот вопрос опубликован до того, как эта функция была доступна или что-то в этом роде



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что ж, если вы обратитесь к соответствующему документы, вы найдете ...
const [state, setState] = useState(initialState);
Returns a stateful value, and a function to update it.
During the initial render, the returned state (state) is the same as the value passed as the first argument (initialState).
The setState function is used to update the state. It accepts a new state value and enqueues a re-render of the component.
setState(newState);
During subsequent re-renders, the first value returned by useState will always be the most recent state after applying updates.
Итак, ваше новое состояние, каким бы оно ни было, - это то, что вы только что установили в useState, то есть значение initialState. Он поступает непосредственно в state, который после этого обновляется реактивно. Цитата из соответствующего документы:
What does calling useState do? It declares a “state variable”. Our variable is called count but we could call it anything else, like banana. This is a way to “preserve” some values between the function calls — useState is a new way to use the exact same capabilities that this.state provides in a class. Normally, variables “disappear” when the function exits but state variables are preserved by React.
Если вы хотите что-то делать всякий раз, когда ваше состояние обновляется, просто используйте componentDidUpdate.(docs).
Если OP уже использует хуки, ему лучше уйти с использованием useEffect, как указал другой ответчик.
Если React Hooks выпустила 16.8 6 февраля, то как Клэр Лин ссылается на Hooks 10 января?
6 февраля хуки были доступны в стабильном выпуске, хотя многие люди уже использовали их в продакшене за несколько месяцев до этого.
Вы можете использовать useEffect для доступа к последнему состоянию после его обновления. Если у вас есть несколько хуков состояния и вы хотите отслеживать обновление только на их части, вы можете передать состояние в массиве в качестве второго аргумента функции useEffect:
useEffect(() => { console.info(state1, state2)}, [state1])
Вышеупомянутый useEffect будет вызываться только при обновлении state1, и вы не должны доверять значению state2 изнутри этой функции, так как оно может быть не самым последним.
Если вам интересно, является ли функция обновления, созданная useState, синхронной, то есть если React выполняет пакетное обновление состояния при использовании хуков, этот ответ дает некоторое представление об этом.
В моей ситуации это не помогает - state1 может быть изменено несколькими событиями, и я не могу сказать, какое событие вызвало изменение состояния. Был бы очень признателен за старый синтаксис await setState(...).
Обратите внимание, что если вы используете объект или массив в своем состоянии, вам необходимо установить это во втором аргументе массива useEffect, например. useEffect(() => ..., [state.prop])
Мне нужно сделать это внутри функции onPress. Однако useEffect можно вызывать только в теле функционального компонента. Есть другое решение?
да, потому что эти новые перехватчики реакции добавляют больше проблем. реагировать 15 было лучше ИМХО
С хуками (
useEffect) и возможностью передавать текущую переменную состояния - каков ваш вариант использования «скажите мне, когда вы закончите обновлять состояние»?