Reducer使用indexOf检查action.type

时间:2017-06-01 20:55:11

标签: redux react-redux

我写了一个redux reducer,帮助我将来自其他reducer的错误信息分组。

我想知道这是否有任何副作用,因为我没有看到有人这样做。我也想知道是否有更好的方法来做到我想不到的。

这就是我写的:

const errors = (state = {}, action = {}) => {

    let new_state = Object.assign({}, state);

    // if action type contains ERROR and action error is present
    if (action.type.indexOf("ERROR") != "-1" && action.error) {
        let error_id = Utils.hashCode(action.error);

        // if error already in the array
        if (new_state[error_id]) {
            new_state[error_id].count++;
        }

        // otherwise add the message to the list
        else {
            new_state[error_id] = {message: action.error, count: 1};
        }
    }

    // regular switch stmt
    switch (action.type) {
        case ERRORS_RESET: new_state = {}; break;
    }

    return new_state;
}

我的商店现在看起来像这样:

{
    reducer1: {
       something: [],
       error: "Some error message",
    },
    reducer2: {
       something: [],
       error: false,
    },
    reducer3: {
       some_other_obj: {},
       error: "Another error message",
    },
    errors: [
        {message: "Some error message, count: 1}
        {message: "Another error message", count: 2}
    ]
}

1 个答案:

答案 0 :(得分:1)

听取"SOMETHING_ERROR"行动的整体概念很好,但是您的实施存在一些问题。

首先,您的if语句会直接突变现有状态。根据Redux文档的Structuring Reducers - Immutable Update Patterns部分,您需要确保复制每个级别的嵌套。现在你正在复制状态的第一级,而不是嵌套对象。

其次,你总是复制状态,即使没有任何实际改变的状态。这通常会导致UI中出现不必要的重新渲染。