если у вас есть более крупное приложение, система событий является намного лучшим решением, чем передача реквизита.
Думайте так, как рекомендует Flux. компонент -> действие -> диспетчер -> магазин
В запасе у вас будет ваше состояние. Вы должны зарегистрировать обратные вызовы компонентов для хранения. Вы запускаете действие из любого компонента, и любой другой компонент, который прослушивает изменения хранилища, получает данные. Независимо от того, как вы меняете свою иерархию, вы всегда получаете данные там, где это необходимо.
диспетчер.js:
var Promise = require('es6-promise').Promise;
var assign = require('object-assign');
var _callbacks = [];
var _promises = [];
var Dispatcher = function () {
};
Dispatcher.prototype = assign({}, Dispatcher.prototype, {
/**
* Register a Store's callback so that it may be invoked by an action.
* @param {function} callback The callback to be registered.
* @return {number} The index of the callback within the _callbacks array.
*/
register: function (callback) {
_callbacks.push(callback);
return _callbacks.length - 1;
},
/**
* dispatch
* @param {object} payload The data from the action.
*/
dispatch: function (payload) {
var resolves = [];
var rejects = [];
_promises = _callbacks.map(function (_, i) {
return new Promise(function (resolve, reject) {
resolves[i] = resolve;
rejects[i] = reject;
});
});
_callbacks.forEach(function (callback, i) {
Promise.resolve(callback(payload)).then(function () {
resolves[i](payload);
}, function () {
rejects[i](new Error('#2gf243 Dispatcher callback unsuccessful'));
});
});
_promises = [];
}
});
module.exports = Dispatcher;
некоторый образец магазина:
const AppDispatcher = require('./../dispatchers/AppDispatcher.js');
const EventEmitter = require('events').EventEmitter;
const AgentsConstants = require('./../constants/AgentsConstants.js');
const assign = require('object-assign');
const EVENT_SHOW_ADD_AGENT_FORM = 'EVENT_SHOW_ADD_AGENT_FORM';
const EVENT_SHOW_EDIT_AGENT_FORM = 'EVENT_SHOW_EDIT_AGENT_FORM';
const AgentsStore = assign({}, EventEmitter.prototype, {
emitShowAgentsAddForm: function (data) {
this.emit(EVENT_SHOW_ADD_AGENT_FORM, data);
},
addShowAgentsAddListener: function (cb) {
this.on(EVENT_SHOW_ADD_AGENT_FORM, cb);
},
removeShowAgentsAddListener: function (cb) {
this.removeListener(EVENT_SHOW_ADD_AGENT_FORM, cb);
}
});
AppDispatcher.register(function (action) {
switch (action.actionType) {
case AgentsConstants.AGENTS_SHOW_FORM_EDIT:
AgentsStore.emitShowAgentsEditForm(action.data);
break;
case AgentsConstants.AGENTS_SHOW_FORM_ADD:
AgentsStore.emitShowAgentsAddForm(action.data);
break;
}
});
module.exports = AgentsStore;
файл действий:
var AppDispatcher = require('./../dispatchers/AppDispatcher.js');
var AgentsConstants = require('./../constants/AgentsConstants.js');
var AgentsActions = {
show_add_agent_form: function (data) {
AppDispatcher.dispatch({
actionType: AgentsConstants.AGENTS_SHOW_FORM_ADD,
data: data
});
},
show_edit_agent_form: function (data) {
AppDispatcher.dispatch({
actionType: AgentsConstants.AGENTS_SHOW_FORM_EDIT,
data: data
});
},
}
module.exports = AgentsActions;
в каком-то компоненте вы похожи:
...
componentDidMount: function () {
AgentsStore.addShowAgentsAddListener(this.handleChange);
},
componentWillUnmount: function () {
AgentsStore.removeShowAgentsAddListener(this.handleChange);
},
...
этот код довольно старый, но он работает хорошо, и вы определенно можете понять, как все работает.
person
Lukas Liesis
schedule
22.05.2016
App
должен знать об изменении дочерних компонентов? - person WiredPrairie   schedule 14.03.2015