后台管理系统中block必须是语义清晰、可复用、职责明确的ui单元(如user-card、permission-tree),element仅限一级(禁止card__header__title),modifier须表达稳定状态(如button--disabled),不可描述颜色或位置。

后台管理系统用 BEM 不是加几个下划线就完事,关键在块(Block)的边界是否真正独立、元素(Element)是否只有一层、修饰符(Modifier)是否只表达稳定状态——否则写出来的 user-list__item__avatar 或 button--primary--disabled 会立刻在协作中失控。
后台系统里哪些组件必须定义为 Block?
Block 必须是语义清晰、可复用、有明确职责的 UI 单元,不是视觉容器。比如 user-card、permission-tree、log-table 都合格;而 section-2、wrap、container 这类泛义名不能当 Block。
-
user-card可出现在用户列表页、详情弹窗、导出预览页,它就是独立 Block,不因位置变化而改名 - 表格行里的操作按钮不是
table__action-btn,而是复用独立的action-buttonBlock,再用user-card__action表达组合关系 - 面包屑导航整体是
breadcrumbBlock,不是把nav或ol当 Block —— 后者是 HTML 结构,不是业务组件
为什么 card__header__title 是错的?
BEM 禁止 Element 嵌套,card__header__title 违反了「元素只属于一个 Block」原则,也破坏了作用域隔离。浏览器不会报错,但会导致样式难以定位、复用时类名冲突。
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 正确写法是
card__title(标题直接归属 card),或拆成新 Blockheading(如果标题在多个地方复用) - SCSS 中只允许单层嵌套:
.card { &__title {} &__body {} },禁止出现&__header &__title或&__header { &__title {} } - 如果 header 本身需要复用(比如在 modal、sidebar 里都出现),它就该是独立 Block
section-header,而不是 card 的子结构
修饰符(Modifier)怎么写才不翻车?
修饰符必须表达稳定、可预测的状态,不能描述临时样式或视觉特征。后台系统里最常错的是把颜色、尺寸、位置当成 Modifier。
- ✅ 合法:
button--disabled、form--loading、table--compact(“紧凑”是设计语言中的稳定变体) - ❌ 错误:
button--red(换主题就得全局搜替换)、card--big(尺寸随响应式变化,不可靠)、menu--left(位置由布局系统控制,不是菜单自身状态) - 修饰符永远不能单独使用:
button--primary是非法的,必须搭配基础 Block 类:button button--primary - 状态切换优先走
--而非is-:用table--loading,不用is-loading—— 后者不属于标准 BEM 三层,容易和 JS 状态管理混淆
文件结构和工具链怎么配合 BEM?
目录结构不匹配,BEM 就只是命名游戏。每个 Block 必须对应一个独立目录,且 Block 名即目录名。
- Button 组件必须放在
/components/button/,里面只能有button.css、button.tsx、button.test.tsx—— 禁止塞进card.css或common.css - CI 流程里应接入
stylelint-selector-bem-pattern,规则强制componentName: "^[a-z][a-zA-Z0-9]+(-[a-z][a-zA-Z0-9]+)*$",拦截btn__icon(没带 Block 名)、card__title--warning(修饰符写在 Element 上,但警告态其实是卡片整体状态)等错误 - JS 中动态加类必须用工具函数,比如
cn('user-card', { 'user-card--expanded': isExpanded }),避免字符串拼接漏掉 Block 前缀
后台系统里最容易被忽略的,是 Block 边界的模糊性——比如把整个「用户管理页」当 Block,结果页面重构时所有类名全废;或者把「分页器」写成 list__pagination,导致它无法复用到日志页。BEM 的约束力不在语法,而在每次写类名前,你得先问一句:这个东西,能不能独立存在、独立测试、独立发布?
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










