Redux 减速器:映射或不映射编辑

Redux reducers: map or not map on editing

我想知道我是否应该在我的减速器中映射。

这是上下文。

我有一个 redux state 由...

friends [{}, {}]
pets [{}, {}]
users [{}, {}]

其中 3 个是基于 GET 响应的对象数组(本地 API)

这是 friends 数组的一个对象的示例。

{
  id: '982347646324',
  name: 'Peter',
  lastName: 'Doe',
  age: 40
}

所以...现在假设我要编辑此条目。

我目前的减速机案例是...

...
      case EDIT_FRIEND:
      return state.map(el => {
        if (el.id === action.payload.data.id) {
          return {
            ...el,
            name: action.payload.data.name,
            lastName: action.payload.data.lastName,
            age: action.payload.data.age
          }
        }
        return el
      });
...

      default:
      return state;

由于我是新手,在学习过程中,我应该问: 这是正确的方法吗...? 它有效,是的,但我想学习并正确地做它。

我应该用其他方式做吗...? 我应该映射还是不映射...?任何帮助都会非常有帮助。

非常感谢

你不应该在 reducer 中做的事情

  1. 让它变得不纯
  2. 改变状态

由于您使用的是 map 方法,因此它每次都会 return 一个新数组,并且不会改变您之前的数组。所以,用map完全没问题。

有几种方法可以做到这一点,您使用的地图方法就是其中一种,使用它非常好。另一种解决方案是使用 spread syntax 并更新所需的对象,例如

...
  case EDIT_FRIEND: {
      const index = state.findIndex(obj => obj.id === action.payload.data.id);
      return [
         ...state.slice(0, index),
         {
            ...state[index],
            name: action.payload.data.name,
            lastName: action.payload.data.lastName,
            age: action.payload.data.age
          }
          ...state.slice(index + 1)
      ]
 }
 ...

 default:
   return state;

您可以选择以上两种您认为合适的解决方案。您必须牢记的是,您并不是在直接改变商店状态。