开发者问题收集

需要在 React Redux Reducer 状态上运行 .slice

2018-11-21
654

我有一个使用 React、Redux 和 Sagas 的应用程序。我有一个 Reducer,它的状态是一个对象数组。我希望这个 Reducer 通过删除数组的第一个项来处理某个操作。我理解状态需要是不可变的,因此我不能简单地调用 .shift。

这是我现在想做的事情:

const flashcards = (state = [], action) => {
    switch (action.type) {
      case 'MAKE_FLASHCARD':
      console.log(action.payload)
        return action.payload;
      case 'UPDATE_FLASHCARD_ARRAY':
        return ({
          ...state.slice(1,state.length)
        })
      default:
        return state;
    }
  };


  export default flashcards;

第一次调用 UPDATE_FLASHCARD_ARRAY 时, ...state.slice(1,state.length) 有效。但是它在以后的尝试中停止工作。我发现这是因为 state 实际上并没有使用我的切片方法删除第一个索引,而是将第一个索引的值设置为 null。

下面是 Redux stat 的字符串化,有助于说明这一点。

在调用 UPDATE_FLASHCARD_ARRAY 之前:

[{"id":7,"account_id":1,"native_word":"pig","translation":"gris"},{"id":3,"account_id":1,"native_word":"cow","translation":"ku"},{"id":1,"account_id":1,"native_word":"cheese","translation":"ost"},{"id":2,"account_id":1,"native_word":"milk","translation":"melk"},{"id":8,"account_id":1,"native_word":"spider","translation":"ederkopp"}]

在调用 UPDATE_FLASHCARD_ARRAY 之后:

{"0":{"id":3,"account_id":1,"native_word":"cow","translation":"ku"},"1":{"id":1,"account_id":1,"native_word":"cheese","translation":"ost"},"2":{"id":2,"account_id":1,"native_word":"milk","translation":"melk"},"3":{"id":8,"account_id":1,"native_word":"spider","translation":"ederkopp"}}

切片方法正在清除返回与原始状态不同的状态。有人能指出我在这里做错了什么吗?我想要做的就是每次调度 UPDATE_FLASHCARD_ARRAY 时从状态数组中删除第一个对象。

2个回答

.slice 已经返回了一个新数组,您不需要将其展开,您还将它展开到一个对象中,这就是为什么您看到 {"0":... :

case 'UPDATE_FLASHCARD_ARRAY':
  return state.slice(1,state.length)
nanobar
2018-11-21

您是否尝试过 return state.slice(1) 而不是 return ({...state.slice(1,state.length)}) ?后者会创建一个对象,该对象具有与 Array 相同的键,但实际上并不像 Array

Array.isArray([1, 2, 3]) === true
Array.isArray({...[1, 2, 3]}) === false
({...[1, 2, 3]}).slice(1) -> TypeError
Yaroslav Sergienko
2018-11-21