我写了一个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}
]
}
答案 0 :(得分:1)
听取"SOMETHING_ERROR"
行动的整体概念很好,但是您的实施存在一些问题。
首先,您的if
语句会直接突变现有状态。根据Redux文档的Structuring Reducers - Immutable Update Patterns部分,您需要确保复制每个级别的嵌套。现在你正在复制状态的第一级,而不是嵌套对象。
其次,你总是复制状态,即使没有任何实际改变的状态。这通常会导致UI中出现不必要的重新渲染。