尽管您的问题主要是基于个人意见的,但我可以给您一些关于为什么ngrx是一个不错选择的想法。尽管有人说将所有应用程序状态放在一个单一对象(Single State Tree)中并不是一个好主意,但是,在我看来,您的状态无论如何都会存在。使用存储区,它只是在一个地方,并且变化是明确和可跟踪的,而不是在各处散布并由组件本地维护。此外,您可以在应用程序内从存储库中选择特定属性,因此只能选择您关心的数据。如果您在减少器中采用不可变性,例如始终返回数组并使用Observables,则可以利用ChangeDetectionStrategy OnPush。OnPush可以为您提供良好的性能提升。让我们来看看下面这张图,它取自官方Angular
docs:
![enter image description here](https://istack.dev59.com/sV364.webp)
如您所见,Angular应用程序是使用组件架构构建的,这导致了一个组件树。在组件上使用
OnPush
意味着仅当输入属性更改时,才会启动变更检测。例如,如果
Child B
是
OnPush
,而
Child A
是
Default
,并且您在
Child A
内部更改了一些内容,则不会触发
Child B
的变更检测器,因为没有更改输入属性。但是,如果您在
Child B
内部更改了某些内容,则
Child A
将重新呈现,因为它具有默认变更检测器。
关于性能和单状态树就讲到这里。存储的另一个优点是,您实际上可以推理出代码和状态更改。因此,大多数Angular 1.x应用程序的现实是“作用域汤”。以下是Lukas Ruebbelke的博客文章中的一张漂亮的图形:
![enter image description here](https://istack.dev59.com/xeQvN.webp)
这张图片很好地演示了它。Tero Parviainen的另一篇文章谈到了如何通过禁用ng-controller
来改善他的Angular应用程序。这都涉及到作用域混乱和管理不断变化的状态是困难的。 redux
的动机在这里说得很清楚:
如果一个模型可以更新另一个模型,那么视图就可以更新一个模型,进而更新另一个模型,这反过来可能会导致另一个视图更新。在某个点上,您不再理解应用程序中发生的事情,因为您已经失去了对其状态何时、为什么以及如何控制的控制权。当系统不透明且不确定时,很难重现错误或添加新功能。
通过使用ngrx/store,您实际上可以解决此问题,因为您将获得应用程序中清晰的数据流。
由于ngrx受redux的高度启发,我认为相同的主要原则适用:
因此,我认为最大的好处是您可以轻松跟踪用户交互并思考状态更改,因为您会分派操作,这些操作始终导致一个位置,而对于普通模型,您必须找到所有引用并查看何时更改了什么。
使用ngrx / store还使您能够使用devtools查看调试状态容器并恢复更改。时间旅行,我想,是redux的主要原因之一,如果您使用普通旧模型,则相当困难。
如@muetzerich已经提到的那样,可测试性也是使用ngrx / store的好处。减速器是纯函数,这些函数易于测试,因为它们接受输入并简单地返回输出,并且不依赖于函数外部的属性并且没有副作用,例如http调用等。
To jump to the bottom line, I would say that you don't need to use ngrx/store to accomplish any of these tasks, but by doing so, you will be bound by constraints (the three principles mentioned above) that provide a common pattern and deliver significant benefits.
To answer your questions:
Do I need multiple stores for my app if I have multiple data types (stock, order, customer...)?
No, I would not recommend using multiple stores.
How can I structure (design) my app to deal with multiple data types like these?
Perhaps this
blog post by Tero Parviainen might help you figure out how to design your store. He discusses how to design the application state tree for an example app.