javascript - 在 redux 工具包状态中更改数组中的特定元素
问题描述
所以我试图在我的状态下更改数组内对象的属性。
export const changeStatus = createAsyncThunk('changeStatus', async (arg) => {
const todo = arg
const response = await axios.put(`${URL}/${todo._id}`, { ...todo, done: !todo.done })
return response.data
})
这是有效的,它改变了我在数据库中的待办事项,但是当我尝试在我的状态中改变它时,如下所示:
.addCase(changeStatus.fulfilled, (state, action) => {
const {_id, done} = action.payload
let newList = state.list
newList[_id].done = done
})
它给了我一个错误,说我的列表未定义:
未处理的拒绝 (TypeError):newList[_id] 未定义
我不知道为什么,因为我在向我的数组中添加一个新对象时做了一些非常相似的事情,而且效果很好。
.addCase(addTodos.fulfilled, (state, action) => {
let newList = state.list
newList.unshift(action.payload)
})
解决方案
数组还是对象?索引还是ID?
let newList = state.list
newList.unshift(action.payload)
这里说的state.list
是一个array
. 它还说,_id
待办事项的 和它在该数组中的索引之间没有关系,因为我们在此列表的开头添加了新的待办事项,从而更改了每个现有条目的索引。
考虑到这一点,希望现在您可以看到这个问题:
const {_id, done} = action.payload
let newList = state.list
newList[_id].done = done
仅当该项目在列表中的索引为时,访问newList[_id]
才会起作用。_id
我不认为它是。我认为您已经混淆了语法并在这里假设您有一个object
键控_id
而不是array
.
解决方案
你有一个不匹配,所以你可以改变任何一个来匹配另一个。
如果state.list
是array
:
.addCase(changeStatus.fulfilled, (state, action) => {
const {_id, done} = action.payload
// find this todo in the list
const todo = state.list.find(t => t._id === _id);
// update that todo
todo.done = done;
// note: .find() might return undefined, so you may want to handle that
})
.addCase(addTodos.fulfilled, (state, action) => {
// prepend to list
state.list.unshift(action.payload);
})
如果state.list
是键控object
:
.addCase(changeStatus.fulfilled, (state, action) => {
const {_id, done} = action.payload
// update status for this key
state.list[_id].done = done;
})
.addCase(addTodos.fulfilled, (state, action) => {
const todo = action.payload;
// set the todo at this key
state.list[todo._id] = todo;
})
推荐阅读
- sql - SQL 根据来自不同列的值排除具有多个值的记录
- laravel - npm:缺少 Laravel-Mix 目录
- intellij-idea - 如何使用 xpath 查找和替换并使用 intellij 限制我的范围?
- matlab - 如何在 Matlab 中正确地在 CT 正弦图上添加泊松噪声。
- reactjs - 关于 Redux-form 文本输入的建议
- vim - Vim:需要一个按名称切换到活动缓冲区的函数
- kubernetes - 使用特定命令启动容器失败
- r - R - 比较来自 2 个数据帧的值
- mysql - 如何使用复合键从一个表中提供对另一个表的引用
- c# - 无法将 SmartCard 与 winscard.dll 连接?