Angular 2+ 组件嵌入 vs 父子组件

Angular 2+ component transclusion vs Parent-Child components

我刚刚在 Angular 中了解了嵌入,但我不知道在什么情况下使用它会很好,或者它的用途是什么。

有什么不同吗?或者使用其中一个可能是一个好习惯?或者你为什么要使用嵌入?

假设我有这个组件,为什么我要将数据嵌入其中而不是将其写入其中: 场景 1:

import { Component } from '@angular/core';

@Component({
  selector: 'my-component',
  template: `
    <div class="my-component">
      'My component works!'
    </div>
  `
})
export class MyComponent {}

场景 2(转录):

import { Component } from '@angular/core';

@Component({
  selector: 'my-component',
  template: `
    <div class="my-component">
      <ng-content></ng-content>
    </div>
  `
})
export class MyComponent {}

并在应用程序组件中

<div class="app">
  <my-component>
    'My component works!'
  </my-component>
</div>

这与父子组件类似

<div class="my-component">
  <child-component></child-component>
</div>

父组件:

<div class="my-component">
  <ng-content></ng-content>
</div>

应用组件:

<div class="app">
  <my-component>
    <child-component></child-component>
  </my-component>
</div>

这是一个很好的问题,你花在 Angular 上的时间越多,它就会成为 apparent。记住组件的存在是为了划分行为,值得考虑划分哪种行为。

假设您想在您的应用中输入姓名,并且始终希望这些姓名以相同的方式出现并与您的用户互动。在这种情况下,创建一个在任何地方都以相同方式输入名称的名称组件是有意义的,并且需要名称的表单永远不需要关心名称是如何呈现或收集的。在这种情况下,parent-child 关系,其中 child 完全封装了它自己的行为(以及所有 child 行为)是有意义的。

相反,假设您要创建一张内容可变的卡片。您知道您希望边框始终相同,标题具有相同的字体,填充也相同。但是中间的东西会改变,这与卡片的样式无关紧要。这是嵌入的绝佳机会。您创建一个组件,它封装了一组特定的样式和行为,同时对传递给它的内容是不可知的。如果您想将输入放入卡片,parent 可以这样做并将该输入直接绑定到它自己的表格中,而不是为这种情况创建一个新的 child。

总而言之 - 嵌入使您有机会以灵活的方式重用组件,以省力的方式保持某些行为和样式的一致性。传统的 parent-child 无嵌入关系允许您完全封装特定(和确定性)行为,以便 parent 可以在完全不知道其任何内容的情况下使用它