改进redux还原剂
对于下面的Redux reducer代码(主要关注改进redux还原剂,redux,Redux,对于下面的Redux reducer代码(主要关注UPDATE_任务操作和updateTaskreducer函数),我在状态对象上保留了一个项目。该项目有多个里程碑,而该里程碑又有多个任务 当我更新给定任务时,我正在触发update\u task操作。然后,它将执行一个PUT请求,并接收任务的更新版本作为有效负载 接下来,我从我的状态遍历项目对象的所有里程碑。如果它与任务的里程碑\u id匹配,那么我将继续迭代该里程碑的所有任务,构建一个包含所有先前任务的集合,替换我从响应中获得的任务 这是使用
UPDATE_任务
操作和updateTask
reducer函数),我在状态对象上保留了一个项目
。该项目
有多个里程碑
,而该里程碑又有多个任务
当我更新给定任务时,我正在触发update\u task
操作。然后,它将执行一个PUT
请求,并接收任务的更新版本作为有效负载
接下来,我从我的状态遍历项目
对象的所有里程碑
。如果它与任务的里程碑\u id
匹配,那么我将继续迭代该里程碑的所有任务
,构建一个包含所有先前任务的集合,替换我从响应中获得的任务
这是使用Redux构建修改状态的最佳方法吗?此外,是否建议像我这样提取非平凡状态更新的函数?我的代码中有什么可以改进的地方(无论是风格还是我不知道的任何ES6技巧)
您围绕您执行的操作类型构建减缩器。更好的方法是围绕州包含的数据构建缩减器 因此,请仔细查看您的初始状态:
const INITIAL_STATE = { all: [], project: null, milestones: [] };
您可以为每个减速器创建单独的减速器。像这样的东西可能有用
function projects(state={}, action) {
case FETCH_PROJECTS:
return action.payload.data.projects
...etc
}
function activeProject(state={}, action) {
case FETCH_PROJECT:
return action.payload.data.project
case FETCH_MILESTONES:
// add milestone to appropriate project
}
function milestones(state={}, action) {
case FETCH_MILESTONES:
// add milestone
case FETCH_TASKS:
// add task to appropriate milestone
}
function tasks(state={}, action) {
case FETCH_TASKS:
// update appropriate task
}
然后,您可以使用组合所有这些减速器,或者您自己组合它们
要在安排约会时获得一些帮助,请查看。这样做的目的是让数据尽可能地在减缩器中表示出来。这样,您就不需要嵌套的约简,并且避免了复杂性
在您的示例中,每个里程碑都可以有一个创建如下对象的任务列表:
{
m1: { tasks: [t1,t2], ...}
m2: { tasks: [t3], ...}
m3: { tasks: [t4,t5], ...}
}
您的任务可以是将ID映射到其内容的对象,如:
{
t1: {} //task
t2: {} //task
t3: {} //task
t4: {} //task
t5: {} //task
}
对于项目和里程碑也是一样的,以同样的方式将它们联系起来。您围绕您执行的操作类型来构建简化程序。更好的方法是围绕州包含的数据构建缩减器 因此,请仔细查看您的初始状态:
const INITIAL_STATE = { all: [], project: null, milestones: [] };
您可以为每个减速器创建单独的减速器。像这样的东西可能有用
function projects(state={}, action) {
case FETCH_PROJECTS:
return action.payload.data.projects
...etc
}
function activeProject(state={}, action) {
case FETCH_PROJECT:
return action.payload.data.project
case FETCH_MILESTONES:
// add milestone to appropriate project
}
function milestones(state={}, action) {
case FETCH_MILESTONES:
// add milestone
case FETCH_TASKS:
// add task to appropriate milestone
}
function tasks(state={}, action) {
case FETCH_TASKS:
// update appropriate task
}
然后,您可以使用组合所有这些减速器,或者您自己组合它们
要在安排约会时获得一些帮助,请查看。这样做的目的是让数据尽可能地在减缩器中表示出来。这样,您就不需要嵌套的约简,并且避免了复杂性
在您的示例中,每个里程碑都可以有一个创建如下对象的任务列表:
{
m1: { tasks: [t1,t2], ...}
m2: { tasks: [t3], ...}
m3: { tasks: [t4,t5], ...}
}
您的任务可以是将ID映射到其内容的对象,如:
{
t1: {} //task
t2: {} //task
t3: {} //task
t4: {} //task
t5: {} //task
}
对于项目和里程碑也是一样的,以同样的方式将它们联系起来