Я использую React, React Router и Flux.React, React Router and Flux: «отправка в середине отправки», когда я пытаюсь очистить сообщения от магазина
У меня есть MessageStore
, который содержит сообщения (ошибки, предупреждения или успеха), что компоненты моего запуска приложения с помощью MessagesAction.addError()
, MessagesAction.addWarning()
и MessagesAction.addSucess()
.
Сообщение отправлено, и MessageStore
зарегистрирован на Диспетчере, чтобы получить сообщение и сохранить сообщение.
После этого магазин излучает событие, чтобы вызвать методы обратного вызова, прослушивающие новые сообщения. Ничего нового до сих пор.
Моя проблема: мне нужно очистить сообщения от MessageStore
при изменении пути (URL).
Моя первая попытка - прослушать изменения маршрута и отправить действие для очистки сообщений. Код:
родовое-component.jsx
onClickButton: updateGenericInformation() {
GenericAction.updateInformation(this.state.information);
},
componentDidMount: function() {
//listening for the update in GenericStore.
GenericStore.addChangeListener(this.changeRoute);
}
changeRoute: function() {
this.history.pushState(null, '/my-page');
},
routes.jsx
clearMessages: function() {
MessagesAction.clear();
},
ReactDOM.render(<Router onUpdate={this.clearMessages}>{routes}</Router>, appElement);
MessagesAction
clear: function() {
Dispatcher.dispatch({ // error happen here...
actionType: 'CLEAR'
});
}
MessagesStore
case 'CLEAR':
_messages = [];
EventEmitter.prototype.emit('EVENT_MESSAGES_UPDATED');
break;
Ошибка:
flux.js:41 Uncaught Error: Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
На самом деле, чтобы очистить сообщения, каждый компонент вызывает четкие действия от MessagesAction
в своем собственном методе DidMount, что не является хорошим решением.
Я попытался тоже очистить сообщения в моем компоненте сообщений в цикле обновления компонента (после того, как я получаю сообщение и сохранить в государстве):
messages.jsx
componentDidUpdate function() {
if (this.state.messages) {
MessagesAction.clear();
}
}
Я получаю ту же ошибку.
Итак, что такое хорошая практика в React and Flux для этого? Я бы не хотел использовать setTimeout
в решении.
Зачем вам нужно прослушивать изменения маршрута с помощью какого-то магазина? Обработчик 'onUpdate' запускается React Router всякий раз, когда он обнаруживает изменение маршрута. –
И какая ошибка возникает при попытке отправить операцию 'CLEAR'? –
@ КонстантинГрушецкий, привет! Спасибо за внимание. Когда маршрут изменяется, мне нужно очистить MessageStore. Я не использую определенный магазин (например, «PathStore») для сохранения пути и прослушивания изменений из этого магазина. Я также добавил ошибку. – Dherik