如何有条件地发送/quot;“级联”;Redux中的行动

如何有条件地发送/quot;“级联”;Redux中的行动,redux,redux-thunk,Redux,Redux Thunk,我正在开发一个香草js应用程序(自包含的UI组件),我一直在尝试使用Redux使一些逻辑更易于测试和推理 有一个UI事件/用户操作(我们称之为“DO_SOMETHING_action”),可以通过两种不同的方式在UI中触发: 通过按键 用鼠标拖动 对于#1,它足够简单-我很高兴让UI组件确定是否在事件处理程序中按下了相应的键,并直接发送Redux“DO#u SOMETHING_ACTION” 对于#2,关于我们是否应该发送“做某事”或“做其他事情”(或者可能什么都不做)的业务规则非常复杂。我希望

我正在开发一个香草js应用程序(自包含的UI组件),我一直在尝试使用Redux使一些逻辑更易于测试和推理

有一个UI事件/用户操作(我们称之为“DO_SOMETHING_action”),可以通过两种不同的方式在UI中触发:

  • 通过按键
  • 用鼠标拖动
  • 对于#1,它足够简单-我很高兴让UI组件确定是否在事件处理程序中按下了相应的键,并直接发送Redux“DO#u SOMETHING_ACTION”

    对于#2,关于我们是否应该发送“做某事”或“做其他事情”(或者可能什么都不做)的业务规则非常复杂。我希望能够对这种逻辑进行推理和测试——因此我的想法是发送一个“MAYBE\u DO\u SOMETHING”动作(从捕获和抽象的事件处理程序获取最少的必要信息)

    我能/我应该通过发出“也许做点什么”的声音来解决这个问题吗?还是我做得不对?

    当然可以用一声巨响来实现这一点:

    export const dragOverAction = function(payload: DragOverActionPayload) {
      return function(dispatch: Dispatch, getState: () => GlobalStateTree) {
          // Various business logic
          if (someCondition) {
            return;
          }
    
          if (anotherCondition) {
            dispatch(doSomething({
              <snip>
            }));
          } else if (anotherCondition) {
            dispatch(doSomethingElse({
              <snip>       
            }));
          }
    
          // Otherwise, don't dispatch anything.
      }
    }
    
    export const dragOverAction=函数(有效负载:DragOverActionPayload){
    返回函数(dispatch:dispatch,getState:()=>GlobalStateTree){
    //各种业务逻辑
    如果(某些条件){
    返回;
    }
    如果(其他条件){
    发送(剂量测量)({
    }));
    }else if(另一种情况){
    调度(doSomethingElse)({
    }));
    }
    //否则,不要发送任何东西。
    }
    }
    
    测试并不像我预期的那么糟糕:

    import configureMockStore from "redux-mock-store";
    import thunk from "redux-thunk";
    
    export const mockStore = configureMockStore([thunk]); 
    import * as allActions from "../app/actions/index";
    
    describe("dragOverAction", function() {
        it("should <blah blah>", async function() {
            let store = mockStore();
            await store.dispatch<any>(allActions.dragOverAction({
                foo: bar,
                <snip>
            }));
            const actions = store.getActions();
    
            expect(actions).toBe(<snip>);
        });
    });
    
    从“redux mock store”导入configureMockStore;
    从“redux thunk”导入thunk;
    export const mockStore=configureMockStore([thunk]);
    将*作为“./app/actions/index”中的所有操作导入;
    描述(“dragOverAction”,函数(){
    它(“应该”,异步函数(){
    let store=mockStore();
    等待门店发货(allActions.dragOverAction({
    福:酒吧,
    }));
    const actions=store.getActions();
    期望(动作);
    });
    });
    
    如果问题标题有误导性,请道歉-请随意更改为更合适的标题!让一个名为
    的函数shoulddosomething(当前状态)
    返回布尔值怎么样。然后使用该函数确定是否应调度操作。然后针对该函数编写单元测试。@sissonb它将需要返回一个操作(“DO_SOMETHING”、“DO_SOMETHING_ELSE”或null),因为我想测试该操作是否正确填充。但是,是的,这似乎是“可能工作的最简单的事情”-谢谢你可以做两个函数。一个用来做某事,另一个用来做某事<代码>应做某事(当前状态)
    应做某事(当前状态)