Я только что обнаружил, что this.setState()
функция реакции в любом компоненте является асинхронной или вызывается после завершения функции, в которой он был вызван.
Теперь я поискал и нашел этот блог ( операция мутации состояния setState () может быть синхронной в ReactJS )
Здесь он обнаружил, что setState
это асинхронный (вызывается, когда стек пуст) или синхронизация (вызывается сразу после вызова), в зависимости от того, как было инициировано изменение состояния.
Теперь эти две вещи трудно переварить
- В блоге
setState
функция вызывается внутри функцииupdateState
, но то, что вызвалоupdateState
функцию, не является тем, о чем вызываемая функция может знать. - Зачем им делать
setState
async, поскольку JS - это однопоточный язык, а этот setState не является WebAPI или серверным вызовом, поэтому его нужно выполнять только в потоке JS. Делают ли они это для того, чтобы повторный рендеринг не останавливал всех прослушивателей событий и прочее, или есть какая-то другая проблема с дизайном.
setState
: medium.com/@agm1984/...Ответы:
Вы можете вызвать функцию после обновления значения состояния:
Кроме того, если вам нужно обновить сразу несколько состояний, сгруппируйте их все в одну
setState
:Вместо того:
Просто сделай это:
источник
1)
setState
действия асинхронны и группируются для повышения производительности. Это объясняется в документацииsetState
.2) Зачем им делать setState async, поскольку JS - это однопоточный язык, и это
setState
не WebAPI или вызов сервера?Это потому, что
setState
изменяет состояние и вызывает повторную отрисовку. Это может быть дорогостоящая операция, и синхронизация может привести к тому, что браузер не будет отвечать.Таким образом, вызовы setState являются асинхронными, а также группируются для лучшего взаимодействия с пользовательским интерфейсом и производительности.
источник
this.setState({ something: true }, () => console.log(this.state))
Я знаю, что этот вопрос старый, но он долгое время вызывает путаницу у многих пользователей reactjs, включая меня. Недавно Дэн Абрамов (из группы реагирования) только что написал отличное объяснение того, почему природа
setState
асинхронна:https://github.com/facebook/react/issues/11527#issuecomment-360199710
setState
должен быть асинхронным, и есть несколько действительно веских причин для этого в связанном объяснении Дэна Абрамова. Это не означает, что он всегда будет асинхронным - в основном это означает, что вы просто не можете полагаться на его синхронность . ReactJS принимает во внимание многие переменные в сценарии, в котором вы меняете состояние, чтобы решить, когдаstate
действительно следует обновить их и повторно отрендерить ваш компонент.Простой пример, демонстрирующий это, заключается в том, что если вы вызываете
setState
в качестве реакции на действие пользователя, тоstate
, вероятно, будет обновлено немедленно (хотя, опять же, вы не можете на это рассчитывать), поэтому пользователь не почувствует никакой задержки. , но если ты позвонишьsetState
в ответ на ответ на вызов ajax или какое-либо другое событие, которое не запускается пользователем, состояние может быть обновлено с небольшой задержкой, поскольку пользователь действительно не почувствует эту задержку, и это улучшит производительность, ожидая пакетируйте несколько обновлений состояния вместе и реже визуализируйте DOM.источник
Хорошая статья здесь https://github.com/vasanthk/react-bits/blob/master/patterns/27.passing-function-to-setState.md
или передать обратный вызов
this.setState ({.....},callback)
https://medium.com/javascript-scene/setstate-gate-abc10a9b2d82 https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b
источник
Вы можете использовать следующую обертку для вызова синхронизации
источник
Представьте, что в каком-то компоненте увеличивается счетчик:
К родительскому и дочернему компонентам прикреплен обработчик счетчика. Это сделано специально, чтобы мы могли дважды выполнить setState () в одном контексте восходящей цепочки событий щелчка, но из двух разных обработчиков.
Как мы могли предположить, событие одиночного щелчка на кнопке теперь запускает оба этих обработчика, поскольку событие перемещается от цели к самому внешнему контейнеру во время фазы восходящей цепочки.
Следовательно, сначала выполняется btnCountHandler (), ожидаемый для увеличения счетчика до 1, а затем выполняется divCountHandler (), ожидаемый для увеличения счетчика до 2.
Однако счетчик увеличивается только до 1, как вы можете проверить в инструментах React Developer.
Это доказывает, что реагировать
ставит в очередь все вызовы setState
возвращается в эту очередь после выполнения последнего метода в контексте (в данном случае divCountHandler)
объединяет все мутации объекта, происходящие в нескольких вызовах setState в одном контексте (все вызовы методов в рамках одной фазы события имеют один и тот же контекст, например) в один синтаксис мутации одного объекта (слияние имеет смысл, потому что именно поэтому мы можем обновлять свойства состояния независимо в setState () в первую очередь)
и передает его в один единственный setState (), чтобы предотвратить повторный рендеринг из-за нескольких вызовов setState () (это очень примитивное описание пакетной обработки).
Результирующий код, запускаемый реакцией:
Чтобы остановить это поведение, вместо передачи объектов в качестве аргументов методу setState передаются обратные вызовы.
После того, как последний метод завершает выполнение и когда response возвращается для обработки очереди setState, он просто вызывает обратный вызов для каждого setState в очереди, передавая предыдущее состояние компонента.
Таким образом, реакция гарантирует, что последний обратный вызов в очереди обновит состояние, на которое возложили руки все его предыдущие аналоги.
источник
Да, setState () асинхронный.
По ссылке: https://reactjs.org/docs/react-component.html#setstate
Потому что думают
По ссылке: https://github.com/facebook/react/issues/11527#issuecomment-360199710
Асинхронный setState () очень усложняет жизнь тем, кто только начинает и, к сожалению, даже испытывает:
- неожиданные проблемы с рендерингом: отложенный рендеринг или отсутствие рендеринга (в зависимости от логики программы)
- передача параметров - это большое дело
среди других проблем.
Пример ниже помог:
Надеюсь, это поможет.
источник