如何正确操作Reducer内部的状态

时间:2018-05-02 14:32:32

标签: react-native redux react-redux

我的减速机里面有以下情况。当用户回答问题时会触发它。当用户回答问题时,需要从嵌套数组中删除它。

示例问题对象(这些是在数组中)

{
    "title": "Quick Questions",
    "questions": [
        "title": "Hello?"
        "answers" [ /*... array of answers in here */ ]
    ]
}

我的减速机案例

case ANSWER_QUESTION:
    // The 0s here would be dynamically populated
    state.questionGroups[0].questions.splice(0, 1)

    return Object.assign({}, {
        ...state,
    })

但是,在这里我直接操作状态,我知道这是不正确的,并且会导致redux无法正确更新状态以使我的组件重新渲染。

这样做的正确方法是什么?

编辑:这可能是也可能不是我的组件不重新渲染的原因。这可能与使用connect()仅应用浅比较的事实有关,这是正确的吗?

3 个答案:

答案 0 :(得分:0)

首先:您正在使用 Splice 方法,这实际上是一种可变方法。您应该使用切片

第二:如果你需要操纵状态,你应该编辑它的副本。

像这样:

const newState = state;

// here you edit your stte
newState = newState.questionGroups[0].questions.slice(0, 1)

// here you return your new state
return Object.assign({}, {
    ...newState,
})

希望有所帮助

答案 1 :(得分:0)

首先复制状态,然后操纵并返回。

case ANSWER_QUESTION:
  var newState = Object.assign({}, state);
  //make your manipulations here
  return newState;

答案 2 :(得分:0)

每次都应该返回一个新对象。您可以轻松使用ES6功能。

case ANSWER_QUESTION:
        return {
            ...state,
            questionGroups[0]: [...state.questionGroups[0].questions.slice(0, action.payload), ...state.questionGroups[0].questions.slice(action.payload + 1)]
    }