从宿主组件角度覆盖子组件样式的正确方法

Hac*_*ker 3 angular2viewencapsulation angular

什么是从宿主组件覆盖子组件样式的正确方法。我尝试使用, encapsulation: ViewEncapsulation.None但是我需要在style.sass文件而不是主机组件中编写替代内容。什么是堆叠闪电战

Con*_*Fan 7

如果您可以控制子组件代码,则可以定义customStyle输入属性:

@Input() customStyle: {};
Run Code Online (Sandbox Code Playgroud)
<div class="child-div" [ngStyle]="customStyle">I am the child</div>
Run Code Online (Sandbox Code Playgroud)

并从父组件传递它:

<app-child [customStyle]="style1"></app-child>
Run Code Online (Sandbox Code Playgroud)
style1 = {
  backgroundColor: "red",
  height: "150px"
}
Run Code Online (Sandbox Code Playgroud)

有关演示,请参见此堆叠闪电战


类似的技术可以允许将特定的样式属性传递给子组件:

@Input() backgroundColor: string;
Run Code Online (Sandbox Code Playgroud)
<div class="child-div" [style.background-color]="backgroundColor">I am the child</div>
Run Code Online (Sandbox Code Playgroud)

来自父组件:

<app-child backgroundColor="red"></app-child>
Run Code Online (Sandbox Code Playgroud)

有关演示,请参见此堆叠闪电战


否则,直到Angular提出了另一种方法,您可以使用::ng-deep 刺穿阴影的后代组合器从父CSS修改子组件的样式:

:host ::ng-deep .parent .child-div {
  background-color: lime;
  height: 200px;
}
Run Code Online (Sandbox Code Playgroud)

有关演示,请参见此堆叠闪电战

  • 你可以看到[这个问题](/sf/ask/3291696551/)关于`::ng-deep`的弃用。我同意接受的答案:在 Angular 提出替代技术之前使用它。 (4认同)
  • 但是我们不应该正确使用 ::ng-deep 因为它会被弃用。 (2认同)
  • 那么现在这是唯一正确的方法吗? (2认同)