Является ли useState синхронным?

В прошлом нас явно предупреждали, что вызов 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 в строгом режиме).

С хуками (useEffect) и возможностью передавать текущую переменную состояния - каков ваш вариант использования «скажите мне, когда вы закончите обновлять состояние»?

Narigo 10.01.2019 01:54

Вы можете использовать useState с функцией обратного вызова. Это не предусмотрено по умолчанию, но помогает этот настраиваемый хук: github.com/the-road-to-learn-react/use-state-with-callback

Robin Wieruch 31.05.2019 13:12

Функция установки useState действительно принимает обратный вызов, как описано здесь: reactjs.org/docs/hooks-reference.html#functional-updates Был ли этот вопрос опубликован до того, как эта функция была доступна или что-то в этом роде

JohnSnow 21.07.2019 21:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
118
3
122 782
2

Ответы 2

Что ж, если вы обратитесь к соответствующему документы, вы найдете ...

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, как указал другой ответчик.

Alfonso Embid-Desmet 11.06.2019 22:49

Если React Hooks выпустила 16.8 6 февраля, то как Клэр Лин ссылается на Hooks 10 января?

benas 13.06.2019 17:09

6 февраля хуки были доступны в стабильном выпуске, хотя многие люди уже использовали их в продакшене за несколько месяцев до этого.

Alfonso Embid-Desmet 13.06.2019 19:18

Вы можете использовать useEffect для доступа к последнему состоянию после его обновления. Если у вас есть несколько хуков состояния и вы хотите отслеживать обновление только на их части, вы можете передать состояние в массиве в качестве второго аргумента функции useEffect:

useEffect(() => { console.info(state1, state2)}, [state1])

Вышеупомянутый useEffect будет вызываться только при обновлении state1, и вы не должны доверять значению state2 изнутри этой функции, так как оно может быть не самым последним.

Если вам интересно, является ли функция обновления, созданная useState, синхронной, то есть если React выполняет пакетное обновление состояния при использовании хуков, этот ответ дает некоторое представление об этом.

В моей ситуации это не помогает - state1 может быть изменено несколькими событиями, и я не могу сказать, какое событие вызвало изменение состояния. Был бы очень признателен за старый синтаксис await setState(...).

Stanley Luo 02.07.2019 02:22

Обратите внимание, что если вы используете объект или массив в своем состоянии, вам необходимо установить это во втором аргументе массива useEffect, например. useEffect(() => ..., [state.prop])

Enijar 27.02.2020 11:37

Мне нужно сделать это внутри функции onPress. Однако useEffect можно вызывать только в теле функционального компонента. Есть другое решение?

Omar Diaa 27.09.2020 11:24

да, потому что эти новые перехватчики реакции добавляют больше проблем. реагировать 15 было лучше ИМХО

jenkizenki 04.10.2021 19:51

Другие вопросы по теме