reducer 更新状态后对象顺序发生变化

Object order changes after reducer updates the state

目前我正在学习 Redux,尝试各种不同的东西。 所以我制作了一个简单的 TODO 应用程序,可以编辑每个 TODO 项目。

但出于某种原因 UPDATE_TODO reducer 将更新的 TODO 项目放在列表的 和 处。所以该项目已成功更新,但它跳到了 TODO 列表的末尾,而不是停留在原来的位置。

原来的TODO项目定位:

item 1更新后的定位:

在我的 reducer 中,我使用 filter() 过滤除更新的 TODO 之外的所有 TODO,然后为更新的 TODO 项设置一个新状态。

需要有关如何正确更新 TODO 项状态以使其保持在原始位置的建议?

减速机

import { UPDATE_TODO } from '../constants';

const initialState = {
  all: [] // array of all TODO's
}

export default function(state = initialState, action) {
  switch (action.type) {
    ...
    case UPDATE_TODO:
      return {
        ...state,
        all: [
          ...state.all.filter(todo => todo.id !== action.payload.id),
          action.payload
        ]
      };
    default:
      return state;
  }
}

因为您将更新的项目 action.payload 放在最后:

all: [
    ...state.all.filter(todo => todo.id !== action.payload.id),
    action.payload
]

此处 filter 将 return 除更新后的所有待办事项,然后在所有项目之后放置 action.payload(更新后的)。

而不是使用 map 并放置条件,当 todo.id == action.payload.id 将是 true 时 return 更新的项目,否则 return 现有项目.

像这样:

case UPDATE_TODO:
    return {
        ...state,
        all: [
            ...state.all.map(todo => {
                if(todo.id == action.payload.id)
                    return action.payload;
                return todo;
            })              
        ]
};