Есть два способа верстки компонентов по BEM(По крайней мере я знаю только 2). У всех свои минусы и плюсы:
1) Работа с тегом:
ui-tag.component.html
<div class="ui-tag__icon" tag-info></div>
<span class="ui-tag__text">
<ng-content></ng-content>
</span>
ui-tag.component.scss
:host {
display: flex;
align-items: center;
width: max-content;
height: max-content;
border-radius: 8px;
cursor: pointer;
padding: 2px 4px;
background-color: $purple-light;
.ui-tag {
&__icon {
margin-right: 4px;
}
&__text {
@include typography_body_small;
color: $purple;
}
} //
&:hover {
transform: scale(0.05);
}
@include media('<=tablet') {
padding: 2px;
}
&.ui-tag {
&--disabled {
cursor: not-allowed;
background-color: $grey-light;
.ui-tag__text {
color: $grey;
}
}
}
}
В scss мы работаем с тегом через :host
2) Используем тег как обертку и не обращаемся к нему:
ui-tag.component.html
<div class="ui-tag">
<div class="ui-tag__icon" tag-info></div>
<span class="ui-tag__text">
<ng-content></ng-content>
</span>
</div>
ui-tag.component.scss
.ui-tag {
display: flex;
align-items: center;
width: max-content;
height: max-content;
border-radius: 8px;
cursor: pointer;
padding: 2px 4px;
background-color: $purple-light;
$self: &;
&__icon {
margin-right: 4px;
}
&__text {
@include typography_body_small;
color: $purple;
}
&:hover {
transform: scale(0.05);
}
@include media('<=tablet') {
padding: 2px;
}
&--disabled {
cursor: not-allowed;
background-color: $grey-light;
#{$self}__text {
color: $grey;
}
}
}
Мне нравиться второй способ, так как по моему мнению он более понятный, и в нем можно использовать
$self: &
что очень круто, и больше по BEM но есть минус, чтобы обратиться к компоненту из другого в scss нужно будет добавлять к нему класс и писать такое:
.index __tag > * {}
Вообщем как правильнее делать?