Redux 如果我以这种方式为异步操作设计减速器,我会遇到什么问题?

Redux 如果我以这种方式为异步操作设计减速器,我会遇到什么问题?,redux,react-redux,Redux,React Redux,我在创建前端应用程序方面的经验很少,我希望在使用Redux时为自己建立一些约定 目前,我的异步操作还原程序如下所示: const initialState = { isRunning: false, isFinished: false, hasError: false, response: null }; export const updatePostReducer = (state = initialState, action=null) => {

我在创建前端应用程序方面的经验很少,我希望在使用Redux时为自己建立一些约定

目前,我的异步操作还原程序如下所示:

const initialState = {
    isRunning: false,
    isFinished: false,
    hasError: false,
    response: null
};
export const updatePostReducer = (state = initialState, action=null) => {
    switch (action.type) {
        case UPDATE_POST:
            return {
                isRunning: true,
                isFinished: false,
                hasError: false,
                response: null
            };
        break;

        case UPDATE_POST_SUCCESS:
            return {
                isRunning: false,
                isFinished: true,
                hasError: false,
                response: action.payload
            };
        break;

        case UPDATE_POST_ERROR:
            return {
                isRunning: false,
                isFinished: false,
                hasError: true,
                response: null,
                statusCode: action.statusCode
            };

        case UPDATE_POST_INVALIDATE:
            return initialState;
        break;

        default:
            return state;
    }
};
上述方法没有问题,但我发现“过程阶段”令人困惑。因此,我的想法是将其缩短为:

// IMPORTED FROM SEPARATE FILE
const stage = {
  INITIAL: "INITIAL",
  RUNNING: "RUNNING",
  FINISHED: "FINISHED",
  ERROR: "ERROR"
};

const initialState = {
    stage: stage.INITIAL,
    response: null
};
export const updatePostReducer = (state = initialState, action=null) => {
    switch (action.type) {
        case UPDATE_POST:
            return {
                stage: stage.RUNNING,
                response: null
            };
        case UPDATE_POST_SUCCESS:
            return {
                stage: stage.FINISHED,
                response: action.payload
            };
        case UPDATE_POST_ERROR:
            return {
                stage: stage.ERROR,
                response: null,
                statusCode: action.statusCode
            };
        case UPDATE_POST_INVALIDATE:
            return initialState;

        default:
            return state;
    }
};
我认为使用后一种方法有两个优点:

  • 它更干净
  • 如果有其他错误,可以使用switch()而不是肮脏
  • 缺点是:

  • 这需要到处导入stages.js
  • 没有对阶段的细粒度控制

  • 我的问题是:由于没有对阶段的细粒度控制,这会在某些场景中导致问题吗?例如,在某些情况下,是否需要同时使用
    hasrerror=true、isRunning=true

    如果不了解应用程序的用例,您提出的问题很难回答。但如果这不是一个非常简单的问题,我会说,你迟早会遇到这样的简化问题

    我还看到一些未初始化值的问题,如
    statusCode
    。顺便说一句,其他州没有更新。如果在发生错误时更新代码,则在成功重试后代码仍然相同

    我会提出另一种方式,更明确地表达我的观点

    以下是如何:

    const isRunningReducer = (state=false, action=null) => {
        switch (action.type) {
            case UPDATE_POST:
                return true;
            case UPDATE_POST_SUCCESS:
                return false;
            case UPDATE_POST_ERROR:
                return false;
            case UPDATE_POST_INVALIDATE:
                return false;
            default:
                return state;
        }
    };
    
    const isFinishedReducer = (state=false, action=null) => {
        switch (action.type) {
            case UPDATE_POST:
                return false;
            case UPDATE_POST_SUCCESS:
                return true;
            case UPDATE_POST_ERROR:
                return false;
            case UPDATE_POST_INVALIDATE:
                return false;
            default:
                return state;
        }
    };
    
    const hasErrorReducer = (state=false, action=null) => {
        switch (action.type) {
            case UPDATE_POST:
                return false;
            case UPDATE_POST_SUCCESS:
                return false;
            case UPDATE_POST_ERROR:
                return true;
            case UPDATE_POST_INVALIDATE:
                return false;
            default:
                return state;
        }
    };
    
    const statusCodeReducer = (state=null, action=null) => {
        switch (action.type) {
            case UPDATE_POST:
                return null;
            case UPDATE_POST_SUCCESS:
                return action.statusCode;
            case UPDATE_POST_ERROR:
                return action.statusCode;
            case UPDATE_POST_INVALIDATE:
                return null;
            default:
                return state;
        }
    };
    
    const responseReducer = (state=null, action=null) => {
        switch (action.type) {
            case UPDATE_POST:
                return null;
            case UPDATE_POST_SUCCESS:
                return action.payload;
            case UPDATE_POST_ERROR:
                return null;
            case UPDATE_POST_INVALIDATE:
                return null;
            default:
                return state;
        }
    };
    
    export const updatePostReducer = combineReducers({
        isRunningReducer,
        isFinishedReducer,
        hasErrorReducer,
        statusCodeReducer,
        responseReducer,
    });
    
    缺点:

    • 更冗长
    • 重复的
    优点:

    • 非常简单易懂的减缩器
    • 不易出错
    • 易于扩展
    • 易于编写生成器代码,以便可以导入标准减速机,如“isRunning”、“isFinished”等
    使用自己的
    createReducer()
    方法,所有这些都可以变得更加优雅,如下所述: