快速上手
用 @lai9fox/bem 创建带图标的按钮,添加样式,并根据禁用状态更新类名。
BEM 将类名分为三部分:
- block(块):组件本身,如
button。 - element(元素):组件的组成部分,如
button__icon。 - modifier(修饰符):组件或元素的变体、状态,如
button--disabled。
安装
npm i @lai9fox/bem
创建按钮和图标
import { createBem } from "@lai9fox/bem";
const button = createBem({ namespace: "ui-" }).block("button");
const node = document.createElement("button");
node.type = "button";
node.className = button.block();
const icon = document.createElement("span");
icon.className = button.element("icon");
icon.setAttribute("aria-hidden", "true");
icon.textContent = "↓";
node.append(icon, "下载");
document.body.append(node);
生成的 HTML 如下:
<button type="button" class="ui-button">
<span class="ui-button__icon" aria-hidden="true">↓</span>
下载
</button>
namespace 设置类名前缀。这里的 ui- 包含末尾的 -;省略该选项时,按钮类名为 button。
添加 CSS
将以下 CSS 添加到项目已加载的样式表中:
.ui-button {
display: inline-flex;
align-items: center;
padding: 0.5rem 0.75rem;
border: 1px solid currentColor;
background: white;
color: #14532d;
}
.ui-button__icon {
margin-inline-end: 0.5rem;
}
.ui-button--disabled {
opacity: 0.5;
cursor: not-allowed;
}
根据状态更新类名
function setDisabled(disabled: boolean) {
node.disabled = disabled;
node.className = button.classes({
block: true,
modifiers: { disabled },
});
}
setDisabled(true);
// node.className: 'ui-button ui-button--disabled'
setDisabled(false);
// node.className: 'ui-button'
block: true 添加基础类 ui-button。disabled 为 true 时,再添加 ui-button--disabled。类名用于设置样式,实际禁用按钮需要设置 node.disabled。