javascript - 当用户能够在其中搜索数据时,我如何才能延迟加载表?
问题描述
所以我有大量数据要加载到表中,可能有数千行,我正在从API获取数据。
现在我有一个明显的问题,即 DOM 将花费大量时间来渲染。
我在谷歌上搜索了延迟加载,我认为这可能是一个解决方案,但我不确定,因为用户可以搜索数据(前端搜索),所以我担心如果数据是不可能的甚至没有在 DOM 中呈现。
即使我必须使用图书馆左右,我也要求提供 javascript 解决方案。
谢谢!
解决方案
您在这里有几个选择:
- 如果可能,在后端进行搜索
- 仅将数据加载到 Javascript 数组中,然后一次只渲染一小部分,然后搜索数组。
您似乎不太可能需要一个库,搜索数据数组的内容应该很简单。
编辑
好的,如果将搜索功能放在后端是不可能的,那么在浏览器中存储和搜索数千行表仍然相当容易。下面的工作示例生成 10000 行随机数据,并显示最多 15 个与用户搜索匹配的数据。添加分页不应该是具有挑战性的。在最后一个循环中,第一页是 j < 15 的值。因此,对于第 2 页打印行,其中 15 ≤ j < 30,对于第 3 页,当 30 ≤ j < 45 时打印,等等。
内存消耗的重要一点是不要将所有数据存储在 DOM 中,而只是隐藏用户不应该看到的行。在这个例子中,DOM 中只有 15 个<tr>
元素,所有数据都存储在一个数组中,并且只呈现用户的当前视图。
const data = [];
const table = document.querySelector('table');
const input = document.querySelector('input');
function printRow(row) {
// in reality you have to escape data for HTML, this is just a quick demo
table.insertAdjacentHTML('beforeend', `<tr><td>${row.id}</td><td>${row.r}</td><td>${row.s}</td>`);
}
// Generate dummy data
for (let i = 0; i < 10000; i++) {
data.push({'id': i,
'r': Math.random().toString(36),
's': Math.random().toString(36)});
}
// Display first page of data
for (let i = 0; i < 15; i++) {
printRow(data[i]);
}
input.addEventListener('input', e => {
table.innerHTML = '';
for (let i = 0, j = 0; i < data.length & j < 15; i++) {
if (data[i].r.indexOf(input.value) >= 0 || data[i].s.indexOf(input.value) >= 0) {
printRow(data[i]);
j++;
}
}
});
<input>
<table border="1"></table>
推荐阅读
- c++ - 如何使用 OpenDDS 3.13 安全性
- laravel - Laravel 包不读取引导程序
- firebase - Firebase 实时数据库仅返回一个条目
- laravel - Laravel 队列已处理,但收件箱中未找到电子邮件
- javascript - 开始在文本框中输入时的 Jquery 文本
- loops - 将来自 db 的值与 array_sum() 卡在 3 个循环中
- c++ - C ++:如何使用结构作为参数传递的链表?
- r - nlsTracePlot 返回“不是函数” - 如何解决这个问题?(R)
- sql - SQL/BIGQUERY 运行平均值与日期中的 GAP
- search - 在 k 维集中搜索最接近的统计显着匹配