构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图?

2023-11-24

我正在使用 ngrx 存储来维护应用程序状态,使用 normalizr 来展平来自 API 调用和 Immutable 的数据。到目前为止,它运行得非常好,但我正在处理一些更复杂的数据关系,我想知道如何继续构建商店。

为了简化事情,我有两组对象。会话和发票。

一位用户登录并可以查看他的会话列表。商店中的状态保存在一个对象中ISessions:

export interface ISessions extends Map<String, any> {
  result: List<Number>;
  entities: {
    sessions: Map<Number, ISessions>,
    clients: Map<Number, IClient>,
    tutors: Map<Number, IProfile>
  },
  adding: boolean;
  loading: boolean;
  loadingFailed: boolean;
  error: string;
}

(实体包含标准化输出 - 客户和导师是会话中包含的嵌套类型)

这真的很有效。减速器将其设置为加载,以便视图可以显示加载栏,然后填充数据,我可以以合理的平面方式使用它,引用映射数据中的 id。

他们可以加载发票,这与IInvoices object:

export interface IInvoices extends Map<String, any> {
  result: List<Number>;
  entities: {
    invoices: Map<Number, IInvoice>,
    clients: Map<Number, IClient>,
    tutors: Map<Number, IProfile>
  },
  adding: boolean;
  loading: boolean;
}

所以我的商店看起来像这样:

export interface IAppState {
  sessions: ISessions;
  invoices: IInvoices;
}

然而,现在我谈到了更复杂的关系。会话被分配给发票。有几种方法可以继续前进:

  1. 每个发票本身都可以有一个 ISessions 对象。这似乎违背了数据结构扁平化的想法。我还可能有重复会话,存储在 AppState.sessions 和 AppState.invoices 中。然而,管理起来会更容易,因为 IInvoice 更直接地映射到视图的状态(加载会话等存储在全部封装的发票 ISessions 对象中)。

  2. 我可以将 ISession 到发票 ID 的映射存储在商店中,与 ISession 和发票分开:

eg:

export interface IAppState {
  sessions: ISessions;
  invoices: IInvoices;
  invoicesSessions: Map<number, ISessions>;
}
  1. 我可以将发票加载到现有的 ISessions 对象中。这意味着所有会话数据都位于同一位置,并且不存在重复。一个问题是我现在很难将其映射到视图。每张发票都必须获取会话列表,并过滤出仅需要的内容。我必须开始跟踪 ISessions 对象中发票会话的加载。

还有一个问题是,我是否应该存储两份单独的客户和导师列表,一份在 ISessions 中,一份在 IInvoices 中。像这样拆分商店是一个坏主意吗?这意味着我的减速器必须整体运行IAppState对象而不是子部分。

基本上:当我获取数据时,我是否应该将其剥离并编译大型 ID 索引列表,然后让视图几乎“查询”他们需要的内容 - 基本上像数据库一样使用存储,或者我应该持有深层嵌套直接反映视图的对象集合 - 意味着数据经常在需要的地方重复多次?


是的,构建 Redux 存储的推荐方法是根据数据而不是视图来构建状态形状,并且对于关系数据的建议是保持其全部标准化。使用选择器函数充当对该状态的查询。

有关更多信息,请参阅:

  • 常见问题解答:组织关系数据?
  • 结构化减速器 - 规范化状态形状
  • React/Redux 链接:选择器和标准化

还有,我的《实用Redux》教程系列展示了如何使用 Redux-ORM 库来管理 Redux 状态中的关系数据:实用 Redux-ORM 基础知识 and 实用 Redux,第 2 部分:Redux-ORM 概念和技术.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图? 的相关文章

  • C++ 支持编译时计数器吗?

    出于自省的目的 有时我想自动将序列号分配给类型或类似的东西 不幸的是 模板元编程本质上是一种函数式语言 因此缺乏实现此类计数器的全局变量或可修改状态 或者确实如此 根据请求的示例代码 include
  • React Router 4 中 URL 更改但视图未更改

    我使用的是react router 4而不是react router 3 所以我使用的是react router dom 我试图让 this props history push 工作 但它所做的只是保持视图相同 但 URL 发生了变化 例
  • Redux Connect w/ HOC - TypeError:无法设置未定义的属性“props”

    我正在 Next js 中构建快速身份验证高阶组件 但在使用以下代码时遇到了一些问题 import SignIn from components sign in import connect from react redux import
  • 带 redux 的进度条

    我的 React Redux 应用程序中有一个后台上传过程 更新非常频繁 我的减速器看起来像这样 export default function progressReducer state initialState action switc
  • React-router-redux 在链接上单击两次即可更新位置状态

    我的应用程序出现问题 无法在任何地方找到解决方案 我用react router redux and syncHistoryWithStore 当我单击导航以使用链接更改路线时 新路线会加载 浏览器中的 URL 会更新 但是location除
  • 比使用流保存增强随机生成器状态更快的替代方案

    我需要能够保存 加载这个增强随机生成器的状态 boost variate generator
  • 如何对这个 Redux thunk 进行单元测试?

    所以我有这个 Redux 动作创建器正在使用redux thunk中间件 accountDetailsActions js export function updateProduct product return dispatch getS
  • NgRx - 状态如何组合和初始化

    当我们初始化 Store 时 StoreModule provideStore r1 Reducer1 r2 Reducer2 我们确实将减速器传递到 Store 进行存储 但我们实际上从未将初始状态传递给存储 除了在减速器函数中定义它 c
  • Redux 调度导致组件本地状态重置

    我将 Redux 与 React 结合使用 我在用着this state 组件本地状态 保存组件特定变量 问题是 每当我调度操作 获取操作 和存储更新 安装 时 我的组件状态都会重置为初始状态 这对我的组件来说是正确的行为吗 第二次安装 重
  • 未捕获的错误:期望增强器是一个函数

    我试图从组件调用减速器并希望在组件中渲染它 但是当我尝试将减速器存储在 redux 的 createStore 方法中时 出现了上述错误 我的代码是这样的 import applyMiddleware compose createStore
  • 在 socket.on() 的回调上调度操作

    所以基本上我得到了这个套接字 它工作正常 向我发送 新订单 消息 我正在使用 redux 并且我想分派一个操作 然后减速器会得到它并且我的商店将会更新 但这段代码没有做任何事情 socket on new order order gt re
  • React textarea 的值是只读的,但需要更新

    我的 React 应用程序中有一个文本区域 其中填充了一个值 我希望更新此文本区域并提交表单以更新数据库中的行
  • React Redux 混乱

    事实证明 Redux 对我来说有点难以理解 我想知道是否有人可以帮助我指出正确的方向 以获取我想要的结果 只是一个预警 我正在使用 ES6 语法 好的 我已经设置了一些沙箱来测试 redux 的工作原理 这是我正在使用的当前文件设置 act
  • 如何在 Redux 减速器中处理树形实体?

    我有点陷入思考如何实现一个减速器 其中它的实体可以有相同类型的子级 让我们以 Reddit 评论为例 每个评论都可以有子评论 子评论本身也可以有评论等 为了简单起见 评论是类型的记录 id pageId value children wit
  • 如何在 RxJS 中通过 ID 去抖

    我的问题是下一个 我想取消我的应用程序的点赞功能 我使用操作在我的应用程序中进行更改 例如 dispatch likePost 1 gt dispatch type LIKE POST id 1 给出下一个例子 我在时间 0 发送一个操作
  • StateObject 作为 init() 中另一个对象的参数

    我试图将 StateObject 用户传递给authenticationHelper 但我不能 因为 IDE 说 在初始化所有存储的属性之前使用 self 即使它是在结构体的开头初始化的 我考虑过将 user 的初始化移至 init 但同样
  • ngrx:如何将参数传递给 createSelector 方法内的选择器

    我的商店有一个非常简单的状态 const state records 1 2 3 我有一个记录选择器 export const getRecords createSelector getState state State gt state
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • DevSettings.reload() 用于 React Native 中的注销

    问题 我正在将混合应用程序的注销功能从本机迁移到反应本机 要求 它可以在生产环境和设备上运行 它导航到应用程序的根屏幕 登录屏幕 它清除 redux 存储 很高兴有 它会取消任何飞行中的请求 最初 我们计划做这样的事情 如何重置 redux
  • 如何从react-bootstrap复选框获取值/属性?

    我正在尝试使用反应引导复选框 https react bootstrap github io components html forms controls https react bootstrap github io components

随机推荐

  • 临时文件未找到文件异常

    我正在构建 java 应用程序 Spring JSF PrimeFaces 我将文件上传到服务器 但是 如果我在文件上传结束后立即单击 下一步 按钮 则会收到此错误 Aug 24 2013 8 12 34 PM org apache cat
  • PHP mkdir() 权限

    我有一个 Linux 服务器 使用 apache 作为 Web 服务器 在我的 PHP 脚本中 我正在创建目录0777模式 代码非常简单 如下所示 mkdir path 0777 当我运行此脚本并转到我的服务器文件管理器时 该文件夹就在那里
  • PHP 简单 HTML DOM 解析器在有效 url 上返回 false

    我正在尝试以下操作 url https www tripadvisor es Hotels g187514 Madrid Hotels html ta html file get html url var dump ta html 它返回
  • Dialog 或 DialogFragment 中的 Activity 是否有等效的dispatchTouchEvent()

    我需要拦截应用程序中的所有触摸事件以监视自定义活动超时 目前我使用dispatchTouchEvent 在我的活动中 但如果屏幕上有对话框 则不会调用此函数 有谁知道是否有任何方法可以在存在对话框的情况下拥有相同的功能 Thanks For
  • Javascript - 在新选项卡中打开链接(同一窗口)

    我意识到这个主题已经有几个问题了 但它们似乎都很老了 只是想为此获得最新的答案 打开新选项卡 在同一浏览器窗口内 的标准方式仍然是 window open url blank window focus 另外 我读到它取决于浏览器的用户配置
  • 将 2 个元素数组的 JavaScript 数组转换为对象键值对

    从这样的事情中获得最快的算法是什么 var array 1 a 2 b 3 c 像这样的事情 Object 1 a 2 b 3 c 到目前为止 这就是我想出的 function objectify array var object arra
  • 计算元音

    谁能告诉我这个脚本有什么问题吗 我是一个 python 新手 但我似乎无法弄清楚是什么导致它无法运行 def find vowels sentence gt gt gt find vowels test 1 count 0 vowels a
  • Matlab中有高斯差分函数吗?

    我是图像处理新手 在我的实验中 我在高斯差分方面遇到困难 给了我各种实现 但我不理解它们及其参数 这是我的公式 我应该自己实现这个过滤 还是有为此定义的现有函数 当然 所有参数都类似于链接中的参数 我需要调整参数并生成不同的图像 您可以使用
  • 如何访问 Angular2 中的 HTML 视频元素

    我有一个 HTML5
  • 使用 char 作为主键/外键是否不行?

    考虑有一堆链接到 国家 或 货币 表的表 为了使数据更易于阅读 我想在这两个表中的每个表中使用国家代码 例如美国 GB AU 和货币代码 美元 澳元 创建 CHAR 字段作为主键 并且所有其他表将使用此 CHAR 作为外键 数据库是带有in
  • iPhone - 将 NSString 编码从 WindowsCP1251 转换为 UTF8

    我怎样才能得到这个转换NSWindowsCP1251StringEncoding to UTF 8 我进行了多次尝试 但没有人能达到应有的效果 我最后的尝试是 NSData dt mystr dataUsingEncoding NSUTF8
  • 如何在使用 ParcelJS 构建的 Cypress 测试中使用绝对路径导入?

    我在 Parcel 项目中使用带有绝对路径的导入 但 Cypress 测试并不能同样解析这些绝对路径 模块分辨率差异 Parcel import foo from foo js 相对于项目根目录 Cypress import foo fro
  • Jquery 中的 Ajax.updater 相当于什么?

    请让我知道 Jquery 中以下原型代码的等效内容 var myAjax new Ajax Updater abc billing add bill detail method get parameters pars insertion I
  • tkinter 窗口获取 x、y、几何/坐标,无需窗口顶部

    我在 python 3 中使用 tk 尽管我假设这适用于任何语言 我正在寻找标题栏之外的 tk 窗口的当前 x y 坐标 import tkinter root tkinter Tk 然而 使用root winfo y 给我坐标 包括标题栏
  • 无法使用 jquery/javascript 在 html5 视频中设置 video.currentTime

    无论是从控制台还是从我的标签中 我都无法使用 JavaScript 设置 html5 视频元素的当前时间 我也在使用 jQuery 但我不知道这是否与该问题相关 我在 Ubuntu 上使用 Google Chrome 24 0 1312 5
  • 创建脚本语言

    有人可以指导我创建针对 WSH Windows 脚本主机 的脚本语言的正确方向吗 我用谷歌搜索过它 但与我几个月前最初搜索它时相比 与此相关的链接似乎要少得多 谢谢 该产品现在称为 Windows Script Host MSDN 文档表明
  • 在 (x) 个字符后剪切文本

    这是在 WordPress 中 不确定这有什么区别 这段 php 输出帖子标题 它是简单文本 长度最多可达 100 个字符 我想要的是如果输出的字符超过 20 长以显示 或根本不显示任何内容 Thanks 检查字符串长度后strlen us
  • delete[] 提供了一个修改后的新指针。未定义的行为?

    我在同行代码评审会议期间看到了如下一些代码 char s new char 3 s a s b s 0 delete s this may or may not crash on some or any day 首先 我知道在标准 C 中
  • 使用 Emacs 在尚未打开的文本文件中递归查找和替换

    作为后续这个问题 它试图找出如何做这样的事情 这应该很容易 这尤其阻止我更习惯使用 Emacs 而是启动我已经熟悉的编辑器 我在编辑多个文件时经常使用这里的示例 在 Ultraedit 中 我会先按 Alt s 然后按 p 显示一个对话框
  • 构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图?

    我正在使用 ngrx 存储来维护应用程序状态 使用 normalizr 来展平来自 API 调用和 Immutable 的数据 到目前为止 它运行得非常好 但我正在处理一些更复杂的数据关系 我想知道如何继续构建商店 为了简化事情 我有两组对