【问题标题】:SCSS encapsulation in Angular libraryAngular 库中的 SCSS 封装
【发布时间】:2018-03-08 18:47:43
【问题描述】:

我想创建一个“可主题化”的 Angular 库,这意味着该库的客户端可以应用例如他们自己的颜色。我检查了材料设计是如何做到的,他们正在做的是这样的:

在(库)/theming.scss:

@mixin hello-button($theme) {
  $hello-background: map-get($theme, 'hello-background');
  .hello {
    background: $hello-background;
  }
}
@mixin apply-theme($theme) {
  @include hello-button($theme);
}

在(客户端)/styles.scss:

@import '~library/theming';
$theme: (
  'hello-background': yellow
);
@include apply-theme($theme);

但这设置了全局类...这里的“.hello”类是全局的,所以任何有“.hello”类的东西都会是黄色的,即使它只是偶然的同名。

所以我的问题是,有没有办法在没有全局类的情况下自定义 scss,这更符合 Angular 的视图封装精神?我知道我可以使用 ngStyle 设置样式,但我更喜欢 scss 方式。

【问题讨论】:

  • Material design classes 以mat 为前缀,如果我没记错的话,可能是为了避免同样的问题。所以你可以确保你的类有一个前缀
  • 是的,但是如果我的前缀是“bla”并且其他人也创建了一个带有前缀“bla”的库怎么办。前缀的老问题,这就是我们现在有视图封装概念的原因。

标签: angular sass


【解决方案1】:

是的,请查看https://angular.io/guide/component-styles:host 部分。

【讨论】:

  • 那么你到底在建议什么,用 ::ng-deep 覆盖一些默认值(这将被弃用)?
  • :host 将 css 的范围限制为仅您正在处理的组件。实际上,如果没有:host,您仍然可以在加载此组件后应用该样式表,因此这可能会填充您的全局。但是,如果未加载此组件,您仍然可以。我们的想法是编写你的 CSS 和组件
  • 但是如何才能为库设置主题?
  • 你想稍后加载样式,不想污染全局,不想使用前缀,不想把样式和组件放在一起。您是在问是否可以将样式表放在全局空间中,同时自动将其应用于组件而无需任何标记。
猜你喜欢
  • 2021-12-13
  • 2018-11-26
  • 2018-12-25
  • 2018-11-17
  • 2019-02-17
  • 2018-10-08
  • 2016-02-26
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多