【问题标题】:Redux using multiple reducersRedux 使用多个 reducer
【发布时间】:2018-04-06 16:05:33
【问题描述】:

我正在制作一个显示食谱的 react/redux 应用程序。当应用程序加载时,我会从所有用户中加载前 10 个,例如提要。我想为个人用户制作一个页面,显示他们所有的食谱。

当我访问他们的页面时,我尝试更改 redux 商店以返回所有用户食谱,但是当我返回主提要时,我必须再次更改商店(所有用户的前 10 个)。这种从 'GET_RECIPES' 到 'GET_USER_RECIPES' 的变化给我带来了问题,因为我一次加载 10 个,我需要返回 ...state + 新加载的食谱。

制作一个只显示用户食谱的新减速器是不好的做法。这似乎是我唯一的选择。因此,我的主要提要有一个减速器,然后当我单击用户页面并按用户 ID 显示所有食谱时使用一个减速器。

这是我目前无法使用的减速器:

const recipesReducer = (state = [], action) => {
    switch (action.type) {
        case 'GET_RECIPES':
            return [...state, ...action.payload];  //PROBLEMS
        case 'POST_RECIPE':
            return [...state, action.payload];
        case 'GET_USER_RECIPES':
            return [...action.payload]
        default:
            return state
    }
}

export default booksReducer;

【问题讨论】:

  • MongoDB 在这个逻辑中的位置以及您如何处理获得前 10 个配方?我的意思是在哪里以及如何?
  • 我将它添加到原始问题中。因为每次加载 10 个配方时,我都会将 redux 更改为 store 以将它们附加到现有的配方中。这与我更改状态以按用户加载所有食谱时发生冲突。我回到提要,它添加到 get all 中的状态并创建重复项。
  • 这与 mongodb 完全无关,在不知道配方实体的关系的情况下无法回答。食谱是否在用户之间共享?您可能希望将它们放在键是配方 ID 的对象中,然后过滤它们以查找关联的用户 ID。当新食谱出现时,您只需将它们添加到您的商店。目前尚不清楚“前 10 个”的确切含义。它们按什么顺序排列?排序标准是什么?
  • 我的意思是你在哪里使用这个?我不明白你如何处理你的状态,但你的提要(每个用户 10 个),用户食谱可以分开。您的帖子将配方添加到用户的配方状态,您可以获取您的提要并调度相关的操作创建者。正如@timotgl 所说,这有点不清楚。
  • 我的 redux 食谱状态是来自所有用户的所有食谱,一次 10 个。当我单击单个用户页面时,我必须点击数据库才能从该用户 ID 中获取所有食谱。为此使用一个减速器并更改状态给我带来了问题,所以我真的在问我是否可以使用多个减速器,一个来自所有用户的食谱(一次 10 个),另一个用户食谱是来自用户的所有食谱我们点击的页面。

标签: reactjs redux react-redux


【解决方案1】:

您可以将减速器状态拆分为一个对象,如下所示:

const initialState = {
  recipes: [],
  userRecipes: []
}

那么你的 reducer 就可以这样工作了:

const recipesReducer = (state = initialState, action) => {
    switch (action.type) {
        case 'GET_RECIPES':
            return {...state, recipes: action.payload};
        case 'GET_USER_RECIPES':
            return {...state, userRecipes: action.payload}
        default:
            return state
    }
}

但是,让我们向您介绍一种不同的方法。这被称为规范化你的 Redux 状态。 Redux documentation 用很好的例子详细解释了这一点。本质上,因为您通常在配方应用程序中拥有的数据类型是关系/嵌套的,您尝试将部分 redux 状态组织为数据库。每种类型的数据,即厨师或食谱,在您所在的州都有自己的部分。这有助于保持您的数据结构“平坦”。

如果您是 React/Redux 的新手,并且这只是一个实验性应用程序,或者您不介意再调用几个 api,那么请坚持第一个选项。状态归一化非常强大,绝对值得学习,但根据您的用例,并不总是最佳选择。

【讨论】:

  • 谢谢你,这对我帮助很大!我习惯于加载所有数据,任何需要删除、编辑或读取的内容都可以通过 id 从主资源中拉出。但是,当您只加载特定数量的资源(在这种情况下一次 10 个配方)时,一切都会变得更加复杂。
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 2018-05-30
  • 2016-12-15
  • 2020-04-24
  • 1970-01-01
  • 2019-07-03
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多