告警列表应使用语义化 <table> 实现:它天然适配结构化数据、保障可访问性、支持横向滚动;状态用 data-status 驱动渲染与无障碍支持;操作后仅局部更新对应 <tr> 元素,配合后端实时过滤确保分页/筛选状态同步。
告警列表页不是“堆数据”,而是要让人一眼看清状态、快速定位问题。核心是:状态可视化 + 操作可达性 + 信息不过载。
<table> 还是 <div> 布局?告警列表本质是结构化数据(时间、级别、设备、状态、操作),<table> 天然语义正确、可访问性好、横向滚动兼容性强。别被“table 过时”误导——只要数据有行列关系,它就是最稳妥的选择。
<table>:列对齐稳定,colgroup 可控宽度,屏幕阅读器能自然读出行列关系<div> + Flex/Grid 实现“伪表格”:缩放或窄屏下容易错行,排序/导出等后续扩展成本高@media 隐藏非关键列(如 description),或加“详情展开”按钮,别强行把表格压成卡片流status 字段怎么渲染成颜色+文字标签?别用一堆 <span class="status-critical"> 手动写样式。用数据驱动渲染,兼顾可维护性和无障碍支持:
{ critical: { text: '严重', color: '#d32f2f' } }
data-status 保留原始值:<td data-status="critical"><span>严重</span></td>
td[data-status="critical"] span { background: #ffebee; color: #d32f2f; }
aria-label 补充语义:<span aria-label="告警级别:严重">严重</span>
关键不是“要不要 AJAX”,而是“更新哪一块 DOM”。直接操作行级元素,避免重绘整张表:
立即学习“前端免费学习笔记(深入)”;
<tr> 加唯一 data-id:<tr data-id="alert_8274">
document.querySelector('tr[data-id="alert_8274"]').classList.add('resolved')
classList.replace() 切换状态类,比 innerHTML 重写更轻量disabled 和 aria-busy="true",防止重复提交最容易被忽略的是分页和筛选后的状态同步——比如在第 3 页屏蔽了一条告警,返回第 1 页时它不该再出现。这要求后端接口必须支持实时过滤,前端不能只靠本地数组 splice。