【问题标题】:React redux: listing and editing. Should use one array of items or array of items and separate edittingItem?React redux:列出和编辑。应该使用一个项目数组还是项目数组和单独的edittingItem?
【发布时间】:2017-03-15 19:00:38
【问题描述】:

如果在我的 React 应用程序中,使用 Redux 和 redux-thunk,我的商店有一组相对轻量级/非规范化的项目,用于所述项目的列表(在 API 中分页),但我也有一个编辑每个 /add 选项(与列表数组中的项目相同,但有许多附加字段,未进行非规范化等),我不知道以下哪个是存储在我的商店中的最佳方法:

  1. 在我的商店中维护一个项目数组,其中包含所有必要的数据(标准化,因此每个都包含一个相对较深的对象图)。编辑只需要在商店中找到它,进行更改,然后切回到 state.items 数组中。
  2. 为项目列表维护一个极简项目数组,同时还有一个根 state.currentItem 对象。
  3. 为项目列表维护一组极简项目,同时将数组重置为仅包含一个项目(包含编辑所需的所有数据)。这避免了需要创建另一个 reducer,这可能是一件好事,也可能不是一件好事。

由于实际列表项对象的数据密集性,我必须使用选项 2/3,但现在我在两个地方有可能不会同步的冗余数据(尽管实际上,在我的应用程序中,由于分页/排序,我必须在返回列表时重新轮询来自 API 的最新数据)或可以包含两种不同对象格式的项目的项目数组。

两者都觉得很脏,这让我相信我错过了一些明显的东西,redux 已经具备处理能力。建议?其他选项?

【问题讨论】:

标签: reactjs react-redux redux-thunk


【解决方案1】:

用户可以同时更新多个项目吗? Redux 尊重 3 important principles。其中之一是单一事实来源,这意味着所有有效/真实数据必须来自一个地方(存储在此处),并且每个数据元素都只存储一次。在商店中多次使用相同的商品很糟糕,主要是因为您说的同步问题。拥有深层对象也不是一个好方法,您应该保持状态平坦。由于您使用的是带有 redux 的 react,因此您可以访问 state、redux 的应用程序状态和 react 的组件状态。此类问题最常见的模式是创建您在组件状态下正在编辑的对象的副本。如果用户取消编辑,将很容易恢复它。如果用户在没有保存的情况下停止编辑项目,您的应用程序状态不会受到影响。此外,您将避免使用错误或重复的数据污染您的应用程序状态。假设在您的列表中,当用户单击某个项目时,该项目将转换为文本输入。列表项将基于 redux 存储项,文本输入将基于同一项的副本。这也适用于新对象。您还可以在添加/更新之前验证您的项目。请记住,最重要的部分是保持商店清洁,因为您将基于此显示商品,因此获取新商品不会影响您的列表。这样做还有助于您更新商店中的商品,因为您只需在发送保存操作时替换它。

【讨论】:

  • 感谢您的回复。你提到的大部分内容我都知道,但我仍然陷入困境:我无法在根部存储 10,000 多个项目的深度图(在考虑所有相关数据时,反过来包含指数更多),但我需要有一个单一的事实来源。在这一点上,我想我通过使用最少的列表数据获取分页列表来处理这个问题。然后在关闭编辑时,将该数组替换为一个新数组,其中包含所有属性所需的所有数据作为单个条目的深度图。多个项目的所有查找列表都转到商店的根目录。
  • 仍然觉得它不正确,我错过了明显的,但至少那时我有一个单一的事实来源。
  • 哦,在这种特殊情况下,不,一次不能编辑多个。对于其他对象,是的,但是对象图要简单得多,所以不用纠结如何处理。
  • 你需要所有这 10,000 项前端吗?或者那些物品(许多道具)很大?所有这些物品都是平的吗?是否存在重复数据?拥有 10,000 个项目可能是个问题。您可以在发送之前计算一些数据吗,甚至可以计算组件吗?如果您的项目是扁平且小的,那么在内存中存储 10,000 多个项目是没有问题的,只要它们没有全部呈现。
  • 对问题的更好描述和可能的解决方案可以在原始讨论中找到 Dan Abramov(normalizr 的创建者)早在groups.google.com/forum/#!topic/reactjs/jbh50-GJxpg 遇到了同样的问题
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 2018-02-17
  • 2011-08-08
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2018-04-10
相关资源
最近更新 更多