Il flusso come modello di progettazione si basa sull'idea che tutti i dati risiedano in "negozi". Ogni negozio contiene dati per un dato dominio di informazioni. Ad esempio: in Flux, tutti i commenti dovrebbero risiedere in un CommentStore.
Quando i dati vengono modificati in un negozio, è necessario emettere un evento e tutti i componenti che si sviluppano sopra questo "dominio delle informazioni", devono eseguire nuovamente il rerender e visualizzare i nuovi dati del dominio.
Ho scoperto che quando un negozio emette più tipi di eventi, è più probabile che i componenti non ascoltino quell'evento specifico, quindi non si riorganizzano quando i dati dei domini vengono modificati.
Questo interrompe l'intero schema di flusso e può facilmente creare bug difficili da trovare dove i componenti non sono sincronizzati con le informazioni del negozio.
Vorrei invece consigliare di progettare i componenti dalla "Legge di Demeter" - ogni componente dovrebbe solo sapere quanto necessario.
Quindi, anziché il componente che ascolta un evento che dice "commentList è stato aggiornato", è necessario creare un componente CommentList che ascolti un evento di un singolo negozio. Quindi, il componente ascolterà su commentStore.on ('cambia') - Di solito permetto a tutti i negozi di emettere un evento 'change'. Quando il negozio emette, è necessario rileggere i dati nel commenListComponent per riflettere lo store. Se si utilizza React, questo è dove si usa 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>
}
})
Questo rende il flusso dei dati molto più semplice ed evita errori di difficile individuazione.
Non ho familiarità con 'react' in particolare, ma le considerazioni principali in generale sono il bilanciamento della scrittura di un codice wireplare di tipo boilerplate per avere tipi di eventi discreti per ogni entità e ogni gestore di eventi di aggiornamento che attiva ogni volta un 'update' viene pubblicato invece di avere un evento di gestione eventi quando viene pubblicato' userUpdated'. Quanto potenza ha il tuo ambiente di runtime? – arootbeer
'Quanto potenza ha il tuo ambiente runtime?' - Cosa significa questa domanda? – gsanta
Penso che reagire non sia appropriato per un evento di aggiornamento, perché ogni negozio rappresenta un'entità indipendente. Quindi l'evento deve provenire, ad esempio da UserStore, quindi non è stato possibile generare un evento di aggiornamento generale. Tuttavia, potrei lanciare un semplice evento di cambiamento dal mio UserStore e fornire come parametro se si tratta di un aggiornamento o di un minimo altro. Non so se sarebbe l'approccio migliore. – gsanta