【问题标题】:Angular - When should I use child components over passing an @inputAngular - 我什么时候应该使用子组件而不是传递@input
【发布时间】:2020-01-28 23:24:23
【问题描述】:

我和我的团队目前正在使用 Angular (v8.x) 创建一个组件库。我们希望建立一些内部管理规则并保持我们的组件界面直观(即输入的一致命名和模式的使用)。

我们在使用@Inputs 和嵌套组件方面发现了两种思想流派。

可以使用以下(淡化)示例来描述我们的差错

示例组件 1:

<our-component [hideChild]="childHidden"></our-component>

示例组件 2:

<our-component>
  <our-child-component></our-child-component>
</our-component>

在示例 1 中,组件有一个 @Input,它显示和隐藏在模板中硬编码的子组件。

在示例 2 中,组件作为子组件添加(或不添加)(通过 ngContent)。

我试图找到一个断言,它指示何时使用一种模式而不是另一种模式。我知道可能没有。我目前的想法是,如果您的组件有 n 个子级或 n 个子级类型,请使用组件嵌套。如果组件只有一种类型的子组件,请使用输入,并将您的子组件包含在您的父组件模板中。

我查看了 Angular 风格指南,但找不到任何特定于此问题的内容。

有没有人知道任何资源或有过这种区分的经验?我想听听您是如何以及为什么以一种或另一种方式实现它的。


编辑:具体来说,我想要以下语句的结尾:

“在嵌套组件上使用 @Inputs ...”“当...时使用嵌套组件而不是@Inputs”


编辑 2:感谢我可能无法正确表达自己。使用我们的组件库以及其他组件,我们正在包装现有的角材料组件,例如mat-input。我们有一个组件,它在我们的模板中包装了 mat-form-field、mat-h​​int 和 mat-input 组件。我们的组件如下所示:

<our-input
 [hideAssistiveText]="hideAssistiveText"
 [type]="inputType"
 [hint]="hint"
 [label]="label"
 [control]="control"
 ... and so on
 ></our-input>

我们不希望显示此组件的某些用例。因此,只要您提供提示字符串,our-input 就会显示our-hint 组件(嵌套在模板内)。

但我也可以像这样实现组件:

<our-input
 [hideAssistiveText]="hideAssistiveText"
 [type]="inputType"
 [label]="label"
 [control]="control"
 ... and so on
 >
   <our-hint label="{{hint}}"></our-hint>
</our-input>

开发人员可以完全省略our-hint 组件来实现相同的目标。

我所追求的是一些明确的最佳实践资源,关于何时使用一种方法而不是另一种方法(如果有的话)或您采用哪种方法的原因。

【问题讨论】:

    标签: angular angular2-styleguide


    【解决方案1】:

    根据我的经验,有几种情况我会推荐示例组件 1 而不是 示例组件 2

    1. 父级将传递给子级的其他输入和输出(或者将来可能会有)。
    2. 正如您在帖子中提到的,当父组件将始终具有相同的子组件并且不支持其他类型的子组件时。

    示例组件 2 在父组件是通用的并且能够拥有各种子组件(或将来某个时候)的情况下会更好。

    除此之外,没有硬性规定,这主要取决于个人喜好。无论哪种方式,请始终考虑将来如何扩展和使用该组件。

    【讨论】:

    • 很好的答案,谢谢。只是为了确认您的第一点,您是说子组件直接与父组件通信会很棘手,因为子组件的输入绑定到祖父组件,对吗?确实是很好的考虑。
    • 为了澄清第一点,假设您有一个 Contact 组件,它有一个子 Address 组件,您可以在其中将联系人的地址信息传递给 address 组件。在这种情况下,使用 @Input 更容易。只要不是这种情况,ngConent 就可以正常工作。
    【解决方案2】:

    我觉得这里有两种思想流派。一是如何组织您的组件以构建您的应用程序,以及您如何管理它们的可见性切换。认为在解决这两者时应该有一个明确的分离。

    【讨论】:

    • 感谢您的回复,尽管这似乎非常特定于隐藏和显示组件。您能否扩展您的答案以回答以下问题:“在 ... 时使用 @Input”和“在 ... 时使用子组件”?
    • 嗨,Jared,我已经修改了我的答案,您能否分享一下您在这里想要实现的具体目标。我的意思是,如果它只是根据一些布尔值在页面上隐藏一些东西,那么 *ngIf 就不够了。
    • 当然,我进行了第二次编辑并再试一次^
    • I c... 我会采用第二种方法,因为这使我们的提示标签组件纯粹是一个表示组件,其工作只是显示传递给它的提示。然后我可以像对待任何第三方组件一样对待它,就像 angular mat select 或 matsnackbar 一样。使其可重复使用且易于测试。
    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 2016-08-09
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2019-07-11
    相关资源
    最近更新 更多