【问题标题】:Fetching single item vs fetching multiple items with Redux获取单个项目与使用 Redux 获取多个项目
【发布时间】:2018-01-31 03:33:28
【问题描述】:

我目前正在开发具有以下内容的应用程序:

  • “课程”页面将显示所有课程以及相关信息 来自数据库。
  • “课程”页面将显示单个课程以及数据库中的相关信息

我的 coursesAction 文件有一个用于从服务器获取单个课程的操作函数和另一个用于从服务器获取所有课程的操作函数。我应该使用单独的减速器来处理课程列表还是单个课程,因为我的 initialState 是一个空数组(用于课程对象列表)?而不是一个空对象(用于课程对象)?:

let initialState =  [];

export default function courseReducer(state = initialState, action){
    switch(action.type){
        case types.LOAD_COURSES_SUCCESS:
            return  action.courses;    
        default:
            return state;
    }
}

或者我应该从服务器检索所有课程,然后在导航到我的“课程”页面时从商店查询我正在寻找的课程?

【问题讨论】:

  • 同一个reducer,不同的switch case
  • 您是否将单门课程添加到数组中?因为这就是我的初始状态所产生的结果
  • 我收回来,不同的减速机更好。就个人而言,我会将其设为具有所有属性的单个对象,但这取决于您。在这种情况下,没有“错误的方式”。

标签: reactjs redux react-redux state


【解决方案1】:

为两个不同的操作创建两个 reducer 并不是一个坏主意,但如果你只是因为初始状态数据类型问题而想将它分开,那么你不需要将它分开。两者都可以以单一方式处理。 使用 immutable,如果你使用 react + rediux,这也是一个很好的做法

导入不可变

import {Record} from 'immutable'

使初始状态对象如下

const Initialstate = new Record({
    course: {},
    courses: []
})

你的减速器是这样的

export default function courseReducer(state = new Initialstate(), action = {}){
    switch(action.type){
        case types.LOAD_COURSES_SUCCESS:
            return  action.courses;
        case types.LOAD_COURSE_SUCCESS:
            return  action.course;    
        default:
            return state;
    }
}

此外,如果将来需要,您可以更改减速器的状态,如下所示。

case types.LOAD_CUSTOM:
            return state.set("customPhase", "success")

【讨论】:

  • 两者兼备确实是个好主意!假设您已经在 redux 存储中的 courses[] 数组中加载了所有课程,您是否仍会对服务器执行 api 调用以检索该课程,或者您是否会查询现有课程状态以查找具有匹配 ID 的课程?还要感谢关于不可变的提示!我去看看!
  • Ummm.. 如果我们这样想,不,我不会为单个课程执行 API 调用以减少时间和服务器负载。 But but but 完成所有课程后可能会更改数据库,然后会导致问题。所以最好做API调用。
  • 是的,我的课程信息是相当静态的,但是在我的状态更有可能发生变化的其他情况下,我肯定会进行 api 调用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2016-12-21
  • 2021-12-07
相关资源
最近更新 更多