回流动作执行后触发通知/回调

时间:2015-12-13 07:58:06

标签: javascript reactjs refluxjs

我最近在我的项目中使用了反流,这个问题让我很困惑 作为回流模式,我在我的React组件中调用操作,并在我的回流存储中获取正在侦听操作的远程数据。我的组件听取了商店中数据的变化。例如,获取项目列表。到目前为止还不错 但有时,我想要一个通知,告诉我行动已成功执行 例如,我有一个UserStore,一个UserActions和一个监听UserStore的LoginComponent。当用户输入用户名和密码并单击提交按钮时,LoginComponent调用UserActions.login(),并在UserStore中发送登录请求。登录成功后,UserStore会从响应中获取用户信息 在这个时候,我想在LoginComponent中给出一个提示,例如'登录成功'。我有两种方法可以做到这一点,但我认为两者都不够好。

  1. 在UserStore的数据中给出一个标志,然后触发更改。当UserStore触发数据更改事件时,LoginComponent获取此标志,然后提示。因为UserStore不仅会在登录成功时触发数据更改,而且还会在某些其他情况下(例如从cookie或sessionStorage获取用户信息)触发数据更改,如果登录成功,则LoginComponent必须为此登录成功标志添加if-else,然后提示。登记/> 我不认为这是一个很好的模式,因为该标志只是用于提示而不是像用户信息这样的真实数据。如果我还想在用户更改密码后提示,我将需要另一个标志字段。
  2. 将promise(或回调函数)传递给UserAction调用,并在登录成功后解析此promise,然后LoginComponent可以在promise.then中提示。它似乎比第一个更好,但它不是一个反模式,因为通过行动传递给商店的承诺可能会打破单向的反流?
  3. 我想问的是:解决这个问题的常用/适当方法是什么?

    我不是来自英语区,也不擅长英语表达。这是我在stackoverflow.com上的第一个问题。我不清楚我是否清楚地描述了我的问题。因此,如果您对我有任何关于这个问题的建议,请告诉我,我会改进它以帮助其他关心这个问题的人。非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以在触发器中包含参数。



export default class AppCtrl extends AppCtrlRender {
  constructor() {
    super();
    this.state = getState();
  }

  componentDidMount = () => { this.unsubscribe = BasicStore.listen(this.storeDidChange); }
  componentWillUnmount = () => { this.unsubscribe(); }
  storeDidChange = (id) => {
    switch (id) {
      case 'data1': this.setState({Data1: BasicStore.getData1()}); break;
      case 'data2': this.setState({Data2: BasicStore.getData2()}); break;
      case 'data3': this.setState({Data3: BasicStore.getData3()}); break;
      default: this.setState(getState());
    }
  }
}






import Reflux from 'reflux';

import Actions from '../actions/sa.Actions';
import AddonStore from './Addon.Store';
import MixinStoreObject from './Mixin.Store';

function _GotData(data) { this.data1 = data; BasicStore.trigger('data1'); }

let BasicStoreObject = {
  init() { this.listenTo(AddonStore, this.onAddonTrigger); },
  data1: {},
  listenables: Actions,
  mixins: [MixinStoreObject],
  onGotData1: _GotData,
  onAddonTrigger() { BasicStore.trigger('data2'); },
  getData1() { return this.data1; },
  getData2() { return AddonStore.data2; },
  getData3() { return this.data3; }
}
const BasicStore = Reflux.createStore(BasicStoreObject);
export default BasicStore;