反应更新对象数组的单个对象 - 映射与整个数组
React updating single object of an array of objects - map vs entire array
我有一个包含本地状态对象数组的组件:
const [myState, setState] = useState<SomeObjectType[]>([]);
我可以通过制作整个数组的副本来更新该数组中的单个对象,然后更新我希望更新的单个对象的 属性:
选项 1
const state = [...myState];
state[id].description = description;
setState(state);
或者我可以使用地图:
选项 2
const newState = talkingPoints.map(el => {
// ️ if id equals, update description property
if (el.id === id) {
return {...el, description};
}
// ️ otherwise return as is
return el;
});
setData(newState);
或者我可以这样做吗(因为我 100% 确定 id 存在于数组中)?
选项 3
const handleUpdate = () => {
setState(prevState => ({
...prevState,
prevState[id].description = description
}))
}
对于我不能 100% 确定我可以使用地图找到它的情况:
选项 4
const handleUpdate = () => {
setState(prevState => ({
myState: prevState.myState.map(el => el.id === id ? { ...el, description } : el)
}))
}
什么是recommended/best修行?
选项 1(完全数组复制)是否比使用 map 更快?
选项3和选项4不正确,prevState/myState是一个数组,你返回的是一个对象,这肯定会导致打字稿错误。至于选项 1 和 2,它们仅在声明式和命令式编程方式之间有所不同。声明式编程使代码更具可读性。
选项 1:
const newState = [...myState];
newState[index].description = "new desc";
// Access index position as opposed to id
// since the item's position may not align with it's id
setState(newState );
选项2上有map
函数,可以这样写:
setState(myState.map(item => item.id === id ? {...item, item.description: "new desc"} : item))
总之,使用map/filter比更新数组更可取。
Here's sandbox 比较选项 1 和 2
我有一个包含本地状态对象数组的组件:
const [myState, setState] = useState<SomeObjectType[]>([]);
我可以通过制作整个数组的副本来更新该数组中的单个对象,然后更新我希望更新的单个对象的 属性:
选项 1
const state = [...myState];
state[id].description = description;
setState(state);
或者我可以使用地图:
选项 2
const newState = talkingPoints.map(el => {
// ️ if id equals, update description property
if (el.id === id) {
return {...el, description};
}
// ️ otherwise return as is
return el;
});
setData(newState);
或者我可以这样做吗(因为我 100% 确定 id 存在于数组中)?
选项 3
const handleUpdate = () => {
setState(prevState => ({
...prevState,
prevState[id].description = description
}))
}
对于我不能 100% 确定我可以使用地图找到它的情况:
选项 4
const handleUpdate = () => {
setState(prevState => ({
myState: prevState.myState.map(el => el.id === id ? { ...el, description } : el)
}))
}
什么是recommended/best修行? 选项 1(完全数组复制)是否比使用 map 更快?
选项3和选项4不正确,prevState/myState是一个数组,你返回的是一个对象,这肯定会导致打字稿错误。至于选项 1 和 2,它们仅在声明式和命令式编程方式之间有所不同。声明式编程使代码更具可读性。
选项 1:
const newState = [...myState];
newState[index].description = "new desc";
// Access index position as opposed to id
// since the item's position may not align with it's id
setState(newState );
选项2上有map
函数,可以这样写:
setState(myState.map(item => item.id === id ? {...item, item.description: "new desc"} : item))
总之,使用map/filter比更新数组更可取。
Here's sandbox 比较选项 1 和 2