在使用JavaScript进行DOM操作时,动态更新列表是常见场景,比如从接口获取新数据后追加到页面。如果不加控制地每次重建整个列表,就会产生重复渲染,造成性能浪费。本文介绍几种避免重复渲染的实用方法。

为什么会产生重复渲染
很多初学者在更新列表时会先清空容器,再遍历数据重新生成所有节点。这种方式逻辑简单,但每次都会销毁并重建全部DOM节点,触发浏览器多次重排和重绘。当列表项较多或更新频繁时,页面就会明显卡顿。
使用文档片段批量更新
如果确实需要插入多个新节点,可以使用 DocumentFragment 在内存中组装,再一次性添加到DOM中,减少渲染次数。
// 假设已有数组 newItems 和新数据
const list = document.getElementById('list');
const fragment = document.createDocumentFragment();
newItems.forEach(function(text) {
const li = document.createElement('li');
li.textContent = text;
fragment.appendChild(li);
});
// 一次性插入,只触发一次渲染
list.appendChild(fragment);
通过唯一标识避免重复添加
为避免同一数据被重复插入,可以给每项数据一个唯一id,并用一个 Set 记录已渲染的id,只添加未出现过的项。
const renderedIds = new Set();
const list = document.getElementById('list');
function addUniqueItem(item) {
if (renderedIds.has(item.id)) {
return; // 已渲染过,直接跳过
}
renderedIds.add(item.id);
const li = document.createElement('li');
li.dataset.id = item.id;
li.textContent = item.name;
list.appendChild(li);
}
复用已有节点进行差异化更新
当列表数据发生变化但结构稳定时,不要重建节点,而是找到对应节点修改其内容。如下面例子,根据id更新已有项的文本。
function updateItem(item) {
const li = list.querySelector('li[data-id="' + item.id + '"]');
if (li) {
li.textContent = item.name; // 复用节点,避免重复渲染
} else {
addUniqueItem(item);
}
}
小结
动态更新列表时,核心思路是减少不必要的DOM销毁与重建。合理使用文档片段、唯一标识判重以及节点复用,就能有效避免重复渲染,让页面保持流畅。
JavaScriptDOM操作重复渲染修改时间:2026-07-29 21:51:17