Почему существует эта ошибка: «Нарушение инварианта: невозможно обновить во время существующего перехода состояния»
Кажется, я сталкиваюсь с этой ошибкой в большом приложении (но я не совсем уверен, где):
Uncaught Ошибка: Инвариантное Нарушение: setState (...): Невозможно обновить во время существующего перехода состояния (например, вrender
). Методы рендеринга должны быть чистой функцией реквизита и состояния.
Я подозреваю, что это может быть результатом использованияsetState
ВнутриsetTimeout
или жеsetInterval
.
Что приводит меня к моему настоящему вопросу: почему существует эта ошибка? Есть ли какая-то концептуальная причина, по которой мне не хватает, почему ReactJS не просто ставит в очередь состояние и поддерживает изменения? Я предполагаю, что если есть причина, это связано со сложностью приложения и / или избеганием условий гонки ...
Тогда мой следующий вопрос будет таким: как правильно обновить компонент вне React (например, во время какого-то асинхронного события), чтобы эта ошибка не возникала?
Редактировать:
После некоторого углубления в эту проблему, похоже, виновник на самом деле является основной платформой, которую я использую (ElectronJS, формально Atom Shell). По сути, ElectronJS объединяет Chromium и NodeJS вместе. Я использовал API-интерфейс NodeJS для выполнения чего-то асинхронного, и, как только это закончится, ElectronJS просто вернется обратно в стек вызовов, где он остановился, полностью обходя цикл событий и, таким образом, вызывая состояние гонки с React.