【发布时间】:2020-09-02 14:58:45
【问题描述】:
我有一个包含 15000 多个项目的 JSON 文件。我的 JSON 文件大约有 7MB。我想在表格中显示所有结果(没有分页)并添加一些复选框以在某些条件下显示或隐藏项目。为了尽可能简化,假设我有一个复选框来仅显示来自巴黎的项目:
问题是UI不流畅。单击复选框大约需要一秒钟来刷新表格。这是不可接受的。
我正在使用fetch() 下载 JSON 数据,然后将其保存在本地。当用户点击复选框时,这就是我所做的:
document.getElementById('paris-only').addEventListener('click', updateTable);
function updateTable() {
const parisOnly = document.getElementById('paris-only').checked;
items.forEach(item => item.visible = !parisOnly || item.city === 'Paris');
refreshTable();
}
function refreshTable() {
[...document.getElementById('items-table').children].forEach((tr, index) => {
tr.classList.toggle('hidden', !items[index].visible);
});
}
.hidden {
display: none;
}
我尝试与setTimeout(_, 0) 一起玩,但没有多大帮助。它减少了 UI 冻结,但刷新表格仍然需要很多时间。
是否有任何策略可以使这样的界面变得活泼?我的一个想法是考虑<canvas>,它可以快速绘制许多元素,但对于这项任务来说似乎不是很自然。
另一种选择是在滚动时使用fetch() 加载数据,但如果可能的话,我希望所有数据只加载一次。
我还应该考虑什么?
【问题讨论】:
-
不是遍历 dom 节点的完整列表,而是过滤 item 中的位置并直接按索引修改那些 dom 节点。适用于您给出的示例,因为您只是在处理 Paris 条目。有很多无限滚动表库,使用起来非常简单,它们通常内置过滤和排序。有 15000 多个条目,无论您做什么,它都可能会很慢。
-
@user120242 我仍然很好奇这是否可以顺利更新 DOM。 21 世纪不能立即更新数千个简单的 DOM 节点,这有点令人失望。
标签: javascript css performance user-interface event-loop