普通块本身不能实现变量填充逻辑,但可通过JavaScript将数据准备、模板构造、DOM插入三步解耦,用数组驱动渲染,封装为可复用函数并结合语义化类名与data属性提升可维护性。

普通块(即不带特定语义的 常见反模式是这样写: 问题在于硬编码索引、无法应对长度变化、难以测试。优化方式是让数据数组自身决定结构: 不要只写一个大 所谓“临时列表变量”,其实是中间数据。不应散落在事件处理函数里,而应封装为纯函数: 如果项目支持 ES2022+,可用更简洁方式表达相同逻辑:用数组驱动渲染,而非手动写死 HTML 字符串
el.innerHTML = `<div><span>${data[0]}</span></div>
<div><span>${data[1]}</span></div>
<div><span>${data[2]}</span></div>`;
renderItem(item),专注单条逻辑map() 生成元素数组,再 join('') 或 forEach() 插入document.createDocumentFragment()),批量插入,减少重排用普通块做“逻辑锚点”,明确作用域边界
就完事。给普通块添加语义化类名或 data 属性,让它成为逻辑载体:
—— 类名提示 JS 操作目标,data 属性记录状态[data-status="loading"]::before 可自动显示加载态,分离表现与逻辑封装填充逻辑为可复用函数,隐藏临时变量细节
function fillList(container, items, { key = 'id', template = defaultTemplate } = {}) {
const frag = document.createDocumentFragment();
items.forEach(item => {
const el = document.createElement('div');
el.className = 'list-item';
el.innerHTML = template(item);
frag.appendChild(el);
});
container.innerHTML = '';
container.appendChild(frag);
}
fillList(listEl, users),无需关心 innerHTML、循环、清空等细节return { elements: [...frag.children] },方便后续绑定事件结合现代语法进一步简化(可选但推荐)
container.replaceChildren(...items.map(renderItem)) 替代 fragment 手动创建item?.name ?? 'N/A' 避免 undefined 报错,减少 guard clauseconst { name = '匿名', avatar } = item;










