Reactjs 在Flux体系结构中,如何从单个用户事件创建两个操作?

Reactjs 在Flux体系结构中,如何从单个用户事件创建两个操作?,reactjs,reactjs-flux,flux,Reactjs,Reactjs Flux,Flux,我认为有三种选择: UI组件调用两个ActionCreator方法。每个ActionCreator发送一条消息 UI组件调用一个ActionCreator方法,该方法发送消息并调用另一个ActionCreator方法 UI组件调用一个ActionCreator方法,该方法不分派任何消息,但调用另外两个ActionCreator方法,每个方法分派自己的消息 是否有理由选择其中一个选项而不是其他选项?还有其他选择吗?埃里克,没有理由选择一个而不是另一个——除非你需要按照特定的顺序来做。如果是这样的话

我认为有三种选择:

  • UI组件调用两个ActionCreator方法。每个ActionCreator发送一条消息
  • UI组件调用一个ActionCreator方法,该方法发送消息并调用另一个ActionCreator方法
  • UI组件调用一个ActionCreator方法,该方法不分派任何消息,但调用另外两个ActionCreator方法,每个方法分派自己的消息

  • 是否有理由选择其中一个选项而不是其他选项?还有其他选择吗?

    埃里克,没有理由选择一个而不是另一个——除非你需要按照特定的顺序来做。如果是这样的话,您可能希望第一个动作完成它的任务,然后调用第二个动作(您在上面的第2条中已经确定)。但是,如果没有顺序,就没有特别的理由选择你概述的三种方法中的任何一种。

    没有理由选择一种而不是另一种,埃里克——除非你需要按照特定的顺序进行。如果是这样的话,您可能希望第一个动作完成它的任务,然后调用第二个动作(您在上面的第2条中已经确定)。但是如果没有顺序,就没有特别的理由选择您概述的三种方法中的任何一种。

    就像哈尔所说的,这取决于您使用它们的目的

  • UI组件调用两个ActionCreator方法。每个ActionCreator发送一条消息
  • 我认为,如果您不确定这些操作的具体用途,那么这是最好的解决方案。如果有可能在其他情况下单独调用这些方法,那么让UI组件调用两个ActionCreator方法会更容易

  • UI组件调用一个ActionCreator方法,该方法发送消息并调用另一个ActionCreator方法
  • 这是一个很好的观点,如果您需要按照特定的顺序执行操作,那么您应该让一个操作调用另一个操作,以确保第一个操作在第二个操作开始之前完成

  • UI组件调用一个ActionCreator方法,该方法不分派任何消息,但调用另外两个ActionCreator方法,每个方法分派自己的消息

  • 我认为这可能是最不有用的,因为它做的事情与情况1相同,但可以强制地将这两个动作绑定在一起。只有在您始终需要执行两个操作时才使用此选项。

    如Hal所述,这取决于您使用它们的目的

  • UI组件调用两个ActionCreator方法。每个ActionCreator发送一条消息
  • 我认为,如果您不确定这些操作的具体用途,那么这是最好的解决方案。如果有可能在其他情况下单独调用这些方法,那么让UI组件调用两个ActionCreator方法会更容易

  • UI组件调用一个ActionCreator方法,该方法发送消息并调用另一个ActionCreator方法
  • 这是一个很好的观点,如果您需要按照特定的顺序执行操作,那么您应该让一个操作调用另一个操作,以确保第一个操作在第二个操作开始之前完成

  • UI组件调用一个ActionCreator方法,该方法不分派任何消息,但调用另外两个ActionCreator方法,每个方法分派自己的消息

  • 我认为这可能是最不有用的,因为它做的事情与情况1相同,但可以强制地将这两个动作绑定在一起。只有在您始终需要执行两个操作时才使用此选项。

    这是setter思考,而不是思考操作的正确方式。操作将通知您的应用程序,它们不会导致副作用

    应用程序由应用商店控制。它们是所有逻辑所在的地方。存储会对从操作中收到的信息产生副作用。行动就像一张报纸。商店对这一消息作出回应

    动作描述真实世界中发生的事情。在这种情况下,用户做了一些事情。它可能是服务器用一些数据响应,或者浏览器完成了一个动画帧。无论如何,这是一个实际发生的单一事件,而不是代码的人工构造

    这里您想要的是以两种不同的方式响应此用户事件,即此单个操作。两个不同的商店将对相同的操作做出响应,但方式不同

    因此,在事件处理程序中会有以下内容:

    MyAppActions.userClicked(itemID);
    
    这将产生一个这样的动作:

    userClicked: function(itemID) { 
      MyDispatcher.dispatch({
        type: MyAppActions.types.USER_CLICKED,
        id: itemID,
      });
    },
    
    这会在你的商店里上演,比如:

    switch (action.type) {
      case MyAppActions.types.USER_CLICKED:
        this._handleUserClicked(action.id);
        break;
      // ...
    }
    

    在这两个商店中,实现_handleUserClicked将执行特定于特定商店的操作。

    这是setter的思维方式,而不是思考操作的正确方式。操作将通知您的应用程序,它们不会导致副作用

    应用程序由应用商店控制。它们是所有逻辑所在的地方。存储会对从操作中收到的信息产生副作用。行动就像一张报纸。商店对这一消息作出回应

    动作描述真实世界中发生的事情。在这种情况下,用户做了一些事情。它可能是服务器用一些数据响应,或者浏览器完成了一个动画帧。无论如何,这是一个实际发生的单一事件,而不是代码的人工构造

    这里您想要的是以两种不同的方式响应此用户事件,即此单个操作。两个不同的商店将对相同的操作做出响应,但方式不同

    因此,在事件处理程序中会有以下内容:

    MyAppActions.userClicked(itemID);
    
    这将产生一个这样的动作:

    userClicked: function(itemID) { 
      MyDispatcher.dispatch({
        type: MyAppActions.types.USER_CLICKED,
        id: itemID,
      });
    },
    
    这会在你的商店里上演,比如:

    switch (action.type) {
      case MyAppActions.types.USER_CLICKED:
        this._handleUserClicked(action.id);
        break;
      // ...
    }
    
    在这两个商店中,实现_handleUserClicked将完成特定于特定客户的任务