改进redux还原剂

改进redux还原剂,redux,Redux,对于下面的Redux reducer代码(主要关注UPDATE_任务操作和updateTaskreducer函数),我在状态对象上保留了一个项目。该项目有多个里程碑,而该里程碑又有多个任务 当我更新给定任务时,我正在触发update\u task操作。然后,它将执行一个PUT请求,并接收任务的更新版本作为有效负载 接下来,我从我的状态遍历项目对象的所有里程碑。如果它与任务的里程碑\u id匹配,那么我将继续迭代该里程碑的所有任务,构建一个包含所有先前任务的集合,替换我从响应中获得的任务 这是使用

对于下面的Redux reducer代码(主要关注
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 
}
对于项目和里程碑也是一样的,以同样的方式将它们联系起来