使用 :host 选择器与容器 div

Use of :host selector vs container div

在我看来,它可以用作 <div> 容器的替代品来为组件设置样式。示例:

使用容器

@Component({
    template: `
        <div class="container">
            <h1>Some Title</h1>
            <p>Some Content</h1>
        </div>
    `,
    styles: [`
        .container {
            border: 1px solid black;
            display: flex;
        }
    `],
})

使用:host

@Component({
    template: `
      <h1>Some Title</h1>
      <p>Some Content</h1>
    `,
    styles: [`
        :host {
            border: 1px solid black;
            display: flex;
        }
    `],
})

如果我没理解错的话,这两个解决的问题完全一样。少一个元素真是太好了,class 几乎每个组件都需要担心。

问题:这是 :host 的目的吗?如果不是,它有什么意义?除了在各处添加容器之外,为组件提供样式的最佳实践是什么?

:host 正在为当前组件(例如 <app-header> 元素)设置包装器元素的样式,据我所知,这是一种为这样的元素设置样式的简短而舒适的方法。

他们解决的不是同一个问题。 :host 用于设置主机的样式,.container 用于设置组件内具有 container class 的任何 div 的样式。

由于封装,.container div 将无法在组件外部设置样式,而可以设置宿主元素的样式。

请注意 display 属性 的初始值为 inline,因此默认情况下您的组件将显示为 inline 元素。也许您不希望这样,尤其是 if you have a block element inside of it 这可能看起来违反直觉(即使它是允许的)。

我还将在当前答案中添加以下观察结果:

class.容器

  • 如果您使用 class .container,那么您必须始终保持它们同步,以防您希望重命名您的组件。在大型应用程序中,这往往发生在开发的早期阶段。
  • 此外,如果您没有良好的 CSS 卫生习惯,这也会让您面临名称冲突的风险。
  • 它可能会在 运行 时通过覆盖元素 class 属性 被错误删除。使用 element.classList.add(); .remove()

:主机

  • 让您免于大量输入(有时组件名称可能会很长)
  • 无论您向元素添加什么 classes,它都会存在。我相信它也必须优先于 .container class.
  • (Angular only) Angular 模拟相同的行为,但如果禁用组件封装,所有 :host 选择器都将变得无用,这可能导致使用 .container class.