反应流量|如何将更改传播到其他商店?

时间:2016-03-16 12:47:31

标签: javascript reactjs flux

我有非常简单的结构1商店,2个组件(父和子,其中父更像是控制器),动作和常量。目前我没有进行任何API调用,所有数据都作为道具进入父组件。

流程非常简单。在子组件中,任何更改都称为父组件提供的回调。

在父组件中,它看起来像这样:

_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));

正如您在调用商店方法setActiveFilters后所看到的,我致电emitChange。为此我在主要组件中有一个监听器:

componentWillMount: function() {
  this.store.addChangeListener(this._onChange);
},

_onChange: function() {
  var newActiveFilters = this._getStoredActiveFilters();
  Actions.changePropagate(newActiveFilters);
  this.setState(newActiveFilters);
},

这是一个问题。 Actions.changePropagate抛出错误:

Uncaught Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.

据我所知,错误被抛出,因为我在上一次完成之前发出新动作。所以我仍然在Actions.setActiveFilters期间打电话给新人。

所以,如果我对子组件进行了任何更改,我会调度一个动作,我的商店会听,这样做很好。但是我怎样才能添加功能,如果我的商店中有任何更改,我可以发送一个动作,在不使用dispatcher.waitFor的情况下在另一个商店中收听?

1 个答案:

答案 0 :(得分:0)

您可以在多个商店中使用一个操作。

只需在每个相关商店中重复使用case Constants.SET_ACTIVE_FILTER:,并相应地使用该商店的有效负载。

作为助焊剂如何运作的规则,"行动"应该确实是用户提交的" actions" 。让代码自动调用动作创建者是一种边缘用例,而且有点反模式。