Ответ 1
Flux как шаблон дизайна строится поверх идеи о том, что все данные хранятся в "магазинах". Каждый магазин хранит данные для данного домена информации. В качестве примера: в Flux все комментарии будут размещаться в блоке CommentStore.
Когда данные изменяются в хранилище, он должен испускать событие, а все компоненты, которые строятся поверх этого "информационного домена", должны воспроизводить и отображать новые данные домена.
Я обнаружил, что, когда хранилище испускает несколько типов событий, более вероятно, что компоненты не прослушивают это конкретное событие, поэтому не реиндексируют себя, когда данные домена изменены.
Это разбивает весь шаблон потока и может легко создавать трудно найти ошибки, когда компоненты не синхронизируются с информацией о магазинах.
Вместо этого я рекомендовал бы, чтобы вы разработали свои компоненты из "Закона Деметры" - каждый компонент должен знать только столько, сколько ему нужно.
Поэтому вместо компонента, слушающего событие, в котором говорится, что "commentList был обновлен", вы должны создать комментарийListComponent, который прослушивает одно событие хранилища. Таким образом, компонент будет прослушивать commentStore.on('change') - я обычно позволяю всем магазинам выпускать событие "change". Когда хранилище эмитирует, вы должны перерегистрировать данные в commenListComponent, чтобы отразить хранилище. Если вы используете React, здесь вы используете setState.
var commentStore = _.extend({}, EventEmitter.prototype, {
updateComents: function() {
// Update comments and emit
this.emit('change');
},
removeComments: function() {
// Remove comments and emit
this.emit('change');
},
getState: function() {
return {
comments: this.comments,
someOtherDomainData: this.meta,
}
}
});
//commentListComponent.js
var commentListComponent = React.createClass({
componentDidMount : function() {
commentStore.on('change', this._commentChanged);
},
componentWillUnmount : function() {
commentStore.off('change', this._commentChanged);
},
_commentChanged : function() {
this.setState({ comments : commentStore.getState().comments });
},
render : function() {
var comments = // Build a list of comments.
return <div>{comments}</div>
}
})
Это делает поток данных более простым и позволяет избежать затруднений при обнаружении ошибок.