Javascript 反应流量|如何将变化传播到其他存储?
我有非常简单的结构1个存储,2个组件(父组件和子组件,父组件更像控制器),动作和常量。现在我不做任何API调用,所有数据都作为道具送到父组件 流程非常简单。在子组件中,任何更改都称为父组件提供的回调 在父组件中,它如下所示:Javascript 反应流量|如何将变化传播到其他存储?,javascript,reactjs,flux,Javascript,Reactjs,Flux,我有非常简单的结构1个存储,2个组件(父组件和子组件,父组件更像控制器),动作和常量。现在我不做任何API调用,所有数据都作为道具送到父组件 流程非常简单。在子组件中,任何更改都称为父组件提供的回调 在父组件中,它如下所示: _saveChangedFilters: function(filterObj, filterName) { Actions.setActiveFilters(filterObj, filterName); } 行动: setActiveFilters: functi
_saveChangedFilters: function(filterObj, filterName) {
Actions.setActiveFilters(filterObj, filterName);
}
行动:
setActiveFilters: function(filterObj, filterName) {
AppDispatcher.dispatch({
action: Constants.SET_ACTIVE_FILTER,
filterObject: filterObj,
filterName: filterName
});
},
店内:
this.dispatchToken = dispatcher.register(_.bind(function(payload) {
switch (payload.action) {
case Constants.MANUFACTURERS_FEED:
this.setManufacturerStructure(payload.brands, payload.models, payload.facets);
break;
case Constants.SET_ACTIVE_FILTER:
this.setActiveFilters(payload.filterObject, payload.filterName);
this.emitChange();
break;
default:
}
}, this));
正如您在调用store方法setActiveFilters
后所看到的,我调用emitChange
。为此,我在主组件中有一个侦听器:
componentWillMount: function() {
this.store.addChangeListener(this._onChange);
},
_onChange: function() {
var newActiveFilters = this._getStoredActiveFilters();
Actions.changePropagate(newActiveFilters);
this.setState(newActiveFilters);
},
这里有一个问题<代码>操作。更改传播引发错误:
Uncaught Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
据我所知,错误是抛出的,因为我在上一个操作完成之前发送了新操作。所以我仍然在执行操作。setActiveFilters
并调用新的
所以,如果我在子组件中有任何更改,我将调度一个操作,我的存储将侦听该操作,这很好。但是我如何添加功能,如果我的存储中有任何更改,我可以发送一个操作,这将是在另一个存储中侦听而不使用
dispatcher.waitFor
?您可以在多个存储中使用一个操作
只需重新使用您的案例常量。在每个相关存储中设置\u ACTIVE\u FILTER:
,并相应地使用该存储的有效负载
作为通量如何运行的规则,“操作”应该是用户提交的“操作”。让代码自动调用action creator是一种边缘用例用法,有点反模式。为什么不使用
dispatcher.waitFor
?看起来这绝对是实现你想要的最短最简单的方法(在商店1更新后更新商店2)。我不明白。什么是反模式?我描述的流程要求我的存储首先处理数据,并将它们与来自其他过滤器的数据相结合。在此之后,任何更改事件都可以传播到其他存储。其他存储无法侦听SET_ACTIVE_FILTER,因为只有当前已更改的筛选器而不是所有具有筛选器的对象。。。其他存储需要具有所有筛选器的完整对象。