reactjs - 你如何为宽数据类型编写 redux reducer?
问题描述
我目前正在开发一个实现类似于 MS Project 的项目 - 具有非常广泛的任务属性的任务管理应用程序。
一个超级简单的任务定义可能是这样的:
{
"id": 0,
"description": "Task 1",
"work": 8,
"startDate": 0,
"assignedResource": "Scott"
}
然而,期望一个任务最终可能有 50 多个字段。
我对 React 和 React-Redux 还很陌生,所以如果我误解了一些简单的方法,请原谅我,但我无法理解如何为这样的数据类型编写 reducer 操作。
这是上述任务的示例减速器:
import { createSlice, current } from '@reduxjs/toolkit'
export const tasksSlice = createSlice({
name: 'tasks',
initialState: [],
reducers: {
addTask: (state, action) => {
state.push(action.payload);
},
deleteTask: (state, action) => {
return state.filter(task => task.id !== action.payload);
},
resetTasks: (state, action) => {
let tasks = action.payload;
return tasks;
},
replaceTask: (state, action) => {
const taskIndex = state.tasks.findIndex(task => task.id == action.payload.id)
return {
...state,
tasks: [
...state.tasks.slice(0, taskIndex),
action.payload,
...state.tasks.slice(taskIndex + 1)
]
}
},
setTaskDescription: (state, action) => {
state.map(t => t.id !== action.payload.id ? t : { ...t, description: action.payload.description })
}
}
})
export const { resetTasks, addTask, deleteTask, replaceTask } = tasksSlice.actions
export default tasksSlice.reducer
我写replaceTask
这篇文章是为了快速写下批量分发的所需更改。但这感觉不对——我不能保证验证或某些错误的突变不会进入商店。另一方面,我无法理解必须为任务的每个领域编写一个动作。
相反,似乎大多数示例都希望您编写类似的操作setTaskDescription
,但这需要我编写大量样板文件。
我缺少这个标准的做法吗?
解决方案
假设您有以下任务:
state = {
tasks: []
}
首先找到索引:
const taskIndex = state.tasks.findIndex(task => task.id == action.payload.id)
现在,替换它:
return {
...state,
tasks: [
...state.tasks.slice(0, taskIndex),
action.payload,
...state.tasks.slice(taskIndex+1)
]
}
推荐阅读
- google-apps-script - Google Doc to PDF export Bug 取决于用户
- powershell - 如果我关闭它正在运行的 PS 窗口,FileSystemWatcher 将停止工作
- pytest - 如何使用 pytest 在测试 API 中传递 json
- javascript - 配置/环境文件的尾随或前导斜杠?
- android - 线性布局多屏
- android - 如何在 Android 中进行 Realm 迁移?
- postgresql - Heroku Express + Postgres 插件需要提升权限
- php - Ajax Modal:将所选值返回到下拉列表到更新表单
- powershell - Powershell 测试路径输出 -eq "False" 不起作用
- c# - XML Unicode 反序列化