【问题标题】:How to properly manipulate state inside of a Reducer如何正确操作 Reducer 内部的状态
【发布时间】:2018-10-12 17:09:54
【问题描述】:

我的减速机内部有以下情况。当用户回答问题时触发。当用户回答问题时,需要将其从嵌套数组中移除。

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

{
    "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() 仅适用于浅比较的事实有关,对吗?

【问题讨论】:

标签: react-native redux react-redux


【解决方案1】:

先复制状态,再操作返回。

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

【讨论】:

    【解决方案2】:

    首先:您正在使用 Splice 方法,它实际上是一个可变方法。您应该改用 Slice

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

    像这样:

    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,
    })
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这是我最初想做的,但是当我写questionGroups[0]时,Visual Studio 代码向我抱怨说expected ":"
      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2016-07-02
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多