在 Angular 中的每个子组件中订阅是一个好习惯吗?

Is it a good practise to have a subscription in every child component in Angular?

我有一个父容器组件和这个父容器内的许多子组件。每个子组件都是一个 tile,它呈现一条信息。每个磁贴都有一个商店的订阅,它会观察一个布尔值。那么,有这么多订阅是一种好习惯吗?或者在父组件中有一个订阅会通过 @Input 向每个组件传递信息更好?

更简洁的代码最好在父组件中有一个订阅并从父组件传递信息。

我们使用输入和输出装饰器将信息从一个组件传递到另一个组件,例如 Parent 和 Child。@Input/@Output API 不会对您有任何帮助。如果您想要双向通信,则必须在 parent 和 child 中进行管理。后来,随着时间的推移,它变得难以管理。其他缺点是您不能对兄弟姐妹进行数据共享。如果(出于某些不可预见的原因)您希望磁贴共享数据怎么办?所以我更喜欢订阅。

我的经验是,如果不是 1-2 个简单的数据片段,我将使用 | async 管道设置订阅。如果我预见到在模板中使用超过 1-2 个地方的数据,我将使用常规 subscribe() - 否则你最终会在模板中有太多地方需要解压数据。最后我决定订阅是否应该是特别的。就像 BehaviourSubject 总是发出一些东西或 ReplaySubject,当它有东西时发出。我喜欢将订阅转移到他们的相关服务上。在服务级别保持所谓的业务逻辑(数据操作)。然后我自己知道所有逻辑都在服务中,并且与用户看到的内容相关的所有内容都在组件级别 - 就像它应该的那样。当一些后端人员出于某种原因来检查代码时也有帮助,这对他们来说更有意义。

如果您发现自己的订阅过多(这种情况发生的速度也很快),您可以将数据连接到更复杂的 object。您保留您的数据 object up-to-data 并在数据更改时,将此数据 object 发送给所有订阅者,这些订阅者只读出与他们相关的信息。

其他明显的最终结果是更清晰的代码。几行订阅数据与打字稿代码中的多行@Inputs/@Ouputs,在一个或多个组件中的 html 中。使用订阅时,您还可以充分利用 rxjs 提供的 god-ness。

tl;dr prefer subscriptions over Input/Output.