Angular如何将视图封装ID选择器传递给子组件@Input传入的CSS类
可行实现方案(无需使用ng-deep、全局样式、ngStyle)
核心原理
Angular的模拟视图封装(ViewEncapsulation.Emulated)默认会给子组件内部的所有DOM元素附加父组件的封装ID属性(_ngcontent-xxx),你不需要手动传递父组件上下文,只要在父组件样式文件中定义透传类的样式,就能自动命中子组件内部使用了对应类的元素。
实现步骤
1. 子组件绑定传入的类
在子组件中将@Input接收的cssClasses绑定到你需要附加类的目标元素上,示例:
// 子组件ts文件 @Input() cssClasses: string = '';
<!-- 子组件模板文件 --> <div class="class1 class2" [class]="cssClasses"></div>
如果你希望类直接附加在子组件宿主元素上,可使用@HostBinding:
@HostBinding('class') get combinedClasses() { return this.cssClasses; }
2. 父组件定义对应样式
直接在父组件的样式文件中编写透传类的样式即可,不需要添加任何特殊修饰符:
/* 父组件css文件 */ .some-css-class { color: #f00; } .some-other-css-class { font-size: 18px; }
如果需要严格限定样式只作用于当前父组件内部,避免意外污染其他组件,可添加:host前缀:
:host .some-css-class { color: #f00; }
最终编译效果
上述写法编译后生成的选择器完全符合你的预期:
/* 子组件自身样式编译结果 */ [_ngStuff-blah-123] .class1 {...} [_ngStuff-blah-123] .class2 {...} /* 父组件透传类样式编译结果 */ [_ngStuff-parent-999] .some-css-class {...} [_ngStuff-parent-999] .some-other-css-class {...}
子组件内部的目标元素同时携带父组件和子组件的封装ID属性,两类样式都能正常匹配生效。
内容的提问来源于stack exchange,提问作者CuriousG
相关产品推荐
相关产品推荐

