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 中做的事情
- 让它变得不纯
- 改变状态
由于您使用的是 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;
您可以选择以上两种您认为合适的解决方案。您必须牢记的是,您并不是在直接改变商店状态。
我想知道我是否应该在我的减速器中映射。
这是上下文。
我有一个 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 中做的事情
- 让它变得不纯
- 改变状态
由于您使用的是 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;
您可以选择以上两种您认为合适的解决方案。您必须牢记的是,您并不是在直接改变商店状态。