为什么在flux应用架构中每个实体使用一个存储?
Why use one store per entity in the flux application architecture?
我正在一个项目中使用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"
}
]
}
]
},
]
}
实际应用程序的界面在左侧显示项目列表,当您选择一个项目时,该项目变为活动项目,其任务显示在右侧。当你点击一个任务时,你可以在一个弹出框中看到它的注释。
我要做的是使用一个单独的商店,"项目商店"。操作向服务器发出请求,获取数据并指示存储用新数据填充自己。存储在内部保存这个实体树(Projects -> Tasks -> Notes)。
为了能够根据所选择的项目显示和隐藏任务,我还将在存储中保留一个变量"activeProjectId"。在此基础上,视图可以获得活动项目,其任务并呈现它们。
问题解决了。
然而,在网上搜索了一下,看看这是否是一个好的解决方案后,我看到很多人说你应该为每个实体使用单独的存储。
这意味着:一个ProjectStore, TaskStore和NoteStore。为了能够管理关联,我可能还需要一个"TasksByProjectStore"和一个"NotesByTaskStore"。
谁能解释一下为什么这样会更好?我唯一看到的是在管理存储和数据流方面有很多开销。
使用一个商店或不同的商店有利有弊。可以说,flux的一些实现特别倾向于一个存储来统治所有存储,而另一些实现也促进了多个存储。
一个商店还是多个商店适合你的需求,取决于a)你的应用做什么,b)你期望未来的发展或变化。简而言之:
- 如果您的主要关注点是嵌套实体之间的依赖关系,则一个store更好。如果您不太担心单个实体之间的依赖关系,服务器-存储-组件之间的关系。如果你想在项目层面上管理底层任务和笔记的统计数据,一个存储是很好的选择。许多父子关系和一体化数据获取表单服务器支持一个存储解决方案。
- 多存储如果你的主要关注点是服务器-存储-组件之间的单个实体连接之间的依赖关系。弱实体对实体关系和独立的单一实体服务器获取和更新有利于多个商店。
在你的情况下,我打赌一家店更好。您有明显的父子关系,并从服务器一次获得所有项目数据。
较长的回答:
一个商店:
- 非常适合最小化管理多个商店的开销。
- 如果你的顶视图组件是唯一有状态的组件,它会很好地工作,并从存储中获取所有数据,并将详细信息分发给无状态的子组件。
- 然而,管理实体之间的依赖关系的需求并没有简单地消失:而不是在不同的商店之间管理它们,您需要在单个商店中管理它们。它因此变得更大(更多的代码行)。
- 此外,在典型的flux设置中,每个store都会发出一个"我已更改"事件,并将其留给组件来确定更改了什么以及是否需要顶部重新渲染。因此,如果您有许多嵌套实体,并且其中一个实体从服务器接收许多更新,那么您的超级商店将发出许多更改,这可能会触发对整个结构和所有组件的许多不必要的更新。Flux-react可以处理很多事情,并且detail-changed-update-everything是它处理得很好的,但它可能不适合每个人的需要(当它搞砸了我在一个项目中状态之间的转换时,我不得不放弃这种方法)。
Multiple stores:
- 更多的开销,是的,但对于一些项目,你也得到回报
- 如果服务器数据和组件之间有紧密耦合,中间有flux存储,则更容易在单独的存储中分离关注点
- 例如,如果您期望对笔记数据结构进行许多更改和更新,那么为笔记提供一个有状态组件更容易,该组件侦听笔记存储,然后处理来自服务器的笔记数据更新。当处理音符结构的变化时,你可以只关注音符存储,而不必弄清楚音符是如何在一些大型超市中处理的。
- 通过另一个php应用程序将我的项目推送到Github存储库中
- 将脚本缓存到本地存储的basket.js概念仍然是一个好主意吗
- 我该如何编写一个CouchDB视图,列出每个存储文档的大小
- Javascript使用本地存储,回调对象并用Json更改为一个字符串以用于填充函数
- 使用本地存储在一个页面上自动填写多个表单
- 我有一个javascript类和该类的对象,我想将该对象存储在本地存储中并检索它
- 制作一个阻止存储在浏览器历史记录中的网页
- 创建一个变量并在页面之间移动时“存储它”,jQuery
- 拆分一个句子并使用JavaScript将其存储在数组中
- 如何使用Javascript将表单数据存储到另一个页面的表中
- Javascript下载一个URL-Azure Blob存储
- 存储一个事件处理程序中的变量以供另一个事件处理器使用
- 需要将服务/工厂存储为一个值
- 在Javascript数组或一个对象中存储多个数据所需的Tweak
- Javascript——运行一个存储在JSON属性中的函数
- 为什么在flux应用架构中每个实体使用一个存储?
- 如何在extjs中创建一个存储在控制器中的实例
- ExtJS:连接一个存储到一个组合框
- 对相同类型的多个元素使用一个存储
- MobX -运行一个存储的构造函数在另一个