javascript - 如何优化 useReducer 中对象数组的更新?
问题描述
我有一个像这样的数据结构:
const dataObj = {
myparam: 'Hello',
data: [
{
id: 1, checked: false
},
{
id: 2, checked: true
}
{
id: 3, checked: false
}
]
}
useReducer
因为我想更新我的arrayList,所以我一直在尝试,这样当我发送我的有效负载时,我可以将 id 为 1 的对象更改为选中/取消选中。
我通过这样做解决了这个问题:
const reducer = (state: StateType, action: Action) => {
const { type, payload } = action;
let newArrayChecked: Array<DataItems> = [];
let newArrayUnchecked: Array<DataItems> = [];
switch (type) {
case ActionKind.Checked:
newArrayChecked = state.items.map((item) => {
const it = item;
if (item.id === payload.id) it.checked = true;
return it;
});
return {
...state,
items: newArrayChecked,
};
case ActionKind.UnChecked:
newArrayUnchecked = state.items.map((item) => {
const it = item;
if (item.id === payload.id) it.checked = false;
return it;
});
return {
...state,
items: newArrayUnchecked,
};
default:
return state;
}
};
我对此并不满意,因为对于初学者来说,它或多或少的重复代码看起来很丑。我想知道使用 useReducer 是否有更好的方法来做到这一点?我对这个 Hook 相当陌生,正在寻找代码优化。
解决方案
您只需像这样更新:
case ActionKind.Checked:
newArrayChecked = state.items.map((item) => {
return {
...item,
checked: item.id === payload.id ? true: item.checked
};
});
return {
...state,
items: newArrayChecked,
};
case ActionKind.UnChecked:
newArrayChecked = state.items.map((item) => {
return {
...item,
checked: iitem.id === payload.id ? false : item.checked
};
});
return {
...state,
items: newArrayUnchecked,
};
推荐阅读
- java - Android Listview 最后不能滚动
- javascript - 为什么我必须点击 2 次才能运行此功能?
- xamarin - Xamarin Android 将 sd 卡写入用户可访问的文件
- excel - 在 VBA 中逐行读取和解析文本文件 - 代码会同时读取所有内容
- sql - SQL - 内部 - 内部连接
- android - 重用 AVD 快照
- javascript - AJAX POST 表单始终从列表中的第一条记录发布数据
- php - 如何确定 PHP 中一组非标准化日期字符串中是否存在日、月或年值?
- javascript - 谷歌浏览器中的 Console.log 自定义字体
- javascript - 递归迭代嵌套对象以更改所有出现的键值(JS)