如何在 Aurelia 视图中反映 BEM 块
How to reflect BEM blocks in Aurelia views
我即将开始一个使用 Aurelia 的新项目,我正在考虑将其与 CSS BEM 方法结合使用。
第一个问题:这是否基本上被认为是一个很好的匹配,或者是否有任何替代方案 "fit" 与 Aurelia 更好?
主要问题:
最好用一些自定义 Aurelia 视图(应用程序 header)的示例进行解释:
<template>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</div>
</template>
当嵌入到另一个视图中时,这会导致结果 DOM 像这样(简化):
<app-header>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu>
<!-- ... -->
</app-menu>
</div>
</app-header>
显然,带有 AppHeader
class 的包装器 div
有点多余,因为还有 app-header
标签。不幸的是,似乎无法将 CSS class AppHeader
(BEM 需要)分配给视图的基本元素(template
中的标记查看文件)。
是否有任何我不知道的替代方法,或者是否认为 "good" 实践(或至少可以接受)在视图中包含许多包装元素,这些元素以某种方式使 DOM 膨胀?
我相信即使有一百个额外的 DOM 节点对于现代浏览器来说也不是问题,但如果避免它们真的很重要,您可以尝试自定义标签而不是 类(请参阅限制列表这里 https://en.bem.info/methodology/faq/#why-are-custom-tags-not-used-for-blocks-in-bem).
也许 @containerless
可以解决您的问题:
在您的视图模型中:
@containerless
export class AppHeader {
...
}
这样,<app-header>
容器就不会被渲染了。
如果您的组件是 view-only 组件,您可以在 <template>
标签中声明 containerless
:
<template containerless>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</div>
</template>
我刚刚意识到,将自定义 类 放在自定义元素本身(template
)上确实有效,所以我可以简单地写这样的东西:
<template class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</template>
编辑/附加信息
如果视图是路线的 "base view",这将不起作用,因为 template
元素在这种情况下根本不会呈现,而是被 router-view
元素。
我即将开始一个使用 Aurelia 的新项目,我正在考虑将其与 CSS BEM 方法结合使用。
第一个问题:这是否基本上被认为是一个很好的匹配,或者是否有任何替代方案 "fit" 与 Aurelia 更好?
主要问题:
最好用一些自定义 Aurelia 视图(应用程序 header)的示例进行解释:
<template>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</div>
</template>
当嵌入到另一个视图中时,这会导致结果 DOM 像这样(简化):
<app-header>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu>
<!-- ... -->
</app-menu>
</div>
</app-header>
显然,带有 AppHeader
class 的包装器 div
有点多余,因为还有 app-header
标签。不幸的是,似乎无法将 CSS class AppHeader
(BEM 需要)分配给视图的基本元素(template
中的标记查看文件)。
是否有任何我不知道的替代方法,或者是否认为 "good" 实践(或至少可以接受)在视图中包含许多包装元素,这些元素以某种方式使 DOM 膨胀?
我相信即使有一百个额外的 DOM 节点对于现代浏览器来说也不是问题,但如果避免它们真的很重要,您可以尝试自定义标签而不是 类(请参阅限制列表这里 https://en.bem.info/methodology/faq/#why-are-custom-tags-not-used-for-blocks-in-bem).
也许 @containerless
可以解决您的问题:
在您的视图模型中:
@containerless
export class AppHeader {
...
}
这样,<app-header>
容器就不会被渲染了。
如果您的组件是 view-only 组件,您可以在 <template>
标签中声明 containerless
:
<template containerless>
<div class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</div>
</template>
我刚刚意识到,将自定义 类 放在自定义元素本身(template
)上确实有效,所以我可以简单地写这样的东西:
<template class="AppHeader">
<span class="AppHeader-logo"></span>
<span class="AppHeader-text"></span>
<app-menu></app-menu>
</template>
编辑/附加信息
如果视图是路线的 "base view",这将不起作用,因为 template
元素在这种情况下根本不会呈现,而是被 router-view
元素。