在reducer中替换整个状态usint Redux

时间:2016-01-25 21:32:06

标签: javascript reactjs redux

标题听起来有线,但如果我从服务器和reducer收集数据会发生什么,我只想返回这些数据并将它们设置为新状态。

E.g。从后端获取数据。如果我想要替换它,我真的需要复制以前的状态:

export function accountData(state = [], action) {
  switch (action.type) {
    case FETCH_FAILURE:
      console.error('SOMETHING BAD JUST HAPPENED');
      break;
    case FETCH_SUCCESS:
        return Object.assign([], state, action.accountData);
    default:
      return state;
  }
}

或者在这种情况下可以这样做:

export function accountData(state = [], action) {
      switch (action.type) {
        case FETCH_FAILURE:
          console.error('SOMETHING BAD JUST HAPPENED');
          break;
        case FETCH_SUCCESS:
            return action.accountData;
        default:
          return state;
      }
    }

1 个答案:

答案 0 :(得分:2)

是的,你可以取代整个州。* Object.assign只是一种方便的方法来替换部分状态,同时保留其他所有状态,并以不可变的方式这样做。如果您要替换整个州,则无需使用Object.assign

(*当我说状态我指的是减速器负责的状态部分。)

此外,将Object.assign用于数组是没有意义的。 Object.assign([], state, action.accountData);在语义上等同于Object.assign([], action.accountData);也就是说,它创建了一个新的数组副本。但由于它是一个数组而不是一个对象,一个更明确和直观的方式来编写它将是action.accountData.slice(0)[...action.accountData] [更正:事实上, Object.assign对数组进行索引索引替换,这几乎肯定不是你想要的。]

只要您认为数组是只读的,您就可以自行返回数组而不复制它。所以你写的最终方式 - return action.accountData; - 完全正确。

最后,我必须对FETCH_FAILURE案件提出异议。你没有为此动作返回任何内容。但是你的reducer应该总是返回某些东西。您应该break;return state;,而不是return [];,而不是query?.whereKey("entriesCount", lessThan: "entriesLimit") 取决于您想要如何处理失败案例。