为什么在 Flux 应用程序架构中每个实体使用一个存储?

2023-11-28

我正在一个项目中使用reactjs 和flux 架构。我对如何将嵌套数据正确分解为存储以及为什么我应该将数据拆分为多个存储感到有点困惑。

为了解释这个问题,我将使用这个例子:

想象一个有项目的 Todo 应用程序。每个项目都有任务,每个任务都可以有注释。

该应用程序使用 REST api 检索数据,返回以下响应:

{
    projects: [
        { 
            id: 1, 
            name: "Action Required",
            tasks: [
                {
                    id: 1,
                    name: "Go grocery shopping",
                    notes: [
                        {
                            id: 1,
                            name: "Check shop 1"
                        },
                        {
                            id: 2,
                            name: "Also check shop 2"
                        }
                    ]
                }
            ]
        },
    ]
}

虚构应用程序的界面在左侧显示项目列表,当您选择一个项目时,该项目将变为活动状态,并且其任务将显示在右侧。当您单击任务时,您可以在弹出窗口中看到其注释。

我要做的是使用 1 个商店,即“项目商店”。操作向服务器发出请求,获取数据并指示存储用新数据填充自身。商店在内部保存该实体树(项目 -> 任务 -> 注释)。

为了能够根据选择的项目显示和隐藏任务,我还在商店中保留一个变量“activeProjectId”。基于此,视图可以获取活动项目、其任务并渲染它们。

问题解决了。

但是:在网上搜索了一下这是否是一个好的解决方案后,我看到很多人说您应该为每个实体使用单独的商店。

这意味着: ProjectStore、TaskStore 和 NoteStore。为了能够管理关联,我可能还需要“TasksByProjectStore”和“NotesByTaskStore”。

有人可以解释一下为什么这样会更好吗?我唯一看到的是管理存储和数据流的大量开销。


使用一家商店或不同商店各有利弊。可以这么说,flux 的某些实现特别支持一个存储来统治所有存储,而其他实现也有利于多个存储。

一家商店还是多家商店适合您的需求,取决于 a) 您的应用程序的功能,以及 b) 您期望的未来发展或变化。简而言之:

  • 一间店如果您主要关心的是嵌套实体之间的依赖关系,则更好。如果您不太担心服务器存储组件之间的单个实体关系之间的依赖关系。一家商店就很棒,例如您想要在项目级别管理有关基础任务和注释的统计信息。许多类似父子关系和从服务器获取一体式数据的方式都支持一种商店解决方案。
  • 多家门店如果您主要关心的是服务器存储组件之间的单个实体连接之间的依赖关系,那就更好了。弱的实体到实体关系和独立的单个实体服务器获取和更新有利于多个存储。

就你而言:我敢打赌,一家商店会更好。您具有明显的父子关系,并从服务器一次获取所有项目数据。

稍微长一点的答案:

一间店:

  • 非常适合最大限度地减少管理多个商店的开销。
  • 如果您的顶视图组件是唯一有状态组件,并且从存储中获取所有数据,并将详细信息分发给无状态子组件,那么它会很好地工作。
  • 但是,管理实体之间的依赖关系的需要并不会简单地消失:您需要在单个商店内管理它们,而不是在不同商店之间管理它们。因此变得更大(更多行代码)。
  • 此外,在典型的通量设置中,每个存储都会发出一个“我已更改”事件,并将其留给组件来确定更改的内容以及是否需要顶部重新渲染。因此,如果您有许多嵌套实体,并且其中一个实体从服务器接收到许多更新,那么您的超级存储会发出许多更改,这可能会触发整个结构和所有组件的大量不必要的更新。 Flux-react 可以处理很多事情,并且细节更改更新一切都是它处理得很好的,但它可能无法满足每个人的需求(当它搞砸了一个项目中状态之间的转换时,我不得不放弃这种方法)。

多家门店:

  • 是的,更多的开销,但对于某些项目,您也可以获得回报
  • 如果服务器数据和组件之间存在紧密耦合,并且中间有通量存储,则更容易将关注点分离到单独的存储中
  • 如果例如您期望对笔记数据结构进行许多更改和更新,这比拥有一个有状态的笔记组件更容易,该组件监听笔记存储,然后处理来自服务器的笔记数据更新。当处理笔记结构的变化时,您可以只关注笔记存储,而不需要弄清楚在一些大型超市中笔记是如何处理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Flux 应用程序架构中每个实体使用一个存储? 的相关文章

  • Javascript Promise“then”始终运行,即使 Promise 未能执行

    我希望当调用第二个 then 时不执行第三个 then 但是 即使 Promise 被拒绝 调用第二个 then 并且代码返回 rejected 然后返回 undefined 它仍然调用第三个 then 如何不运行第三个 then 这样 未
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • 如何在故事书中注入窗口变量?

    我想添加一个 React 组件 称为ApplicationForm to a 故事书 https github com storybooks storybook 故事书是这样写的 import configureStore from sto
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何隐藏/禁用 Highcharts.js 中的图例框?

    我想问是否可以使用 HighCharts js 库隐藏图表中的所有图例框 var chart object chart renderTo render to type graph type colors graph colors title
  • 使用 Vite 和 React 进行生产构建时出错:Uncaught TypeError 中的错误:_ 不是函数

    我在我的网站上使用 Vite React React Router 和 TypeScript 我在运行生产构建时遇到问题 在开发模式下一切正常 使用生产版本时 我的浏览器显示白色背景 并且在浏览器控制台中出现以下错误 上面的链接将我带到第
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐