SSE 实现下拉滚动分页的技巧
随着互联网发展,Web 应用也变得越来越复杂,其中之一便是分页加载。传统的分页从服务器加载完整页面,这种方式在数据量较大、网络较慢的情况下,可能导致页面加载时间过长,用户等待时间过长。为了优化用户体验,前端工程师开始探索更好的分页加载方式,其中 SSE 即是一个很好的选择,本文将介绍如何通过 SSE 实现下拉滚动分页。
SSE(Server-Sent Events),是一种服务器推送技术,它允许浏览器通过 HTTP 协议接收服务器端发送的数据。当后端有新的数据时,可以通过 SSE 推送到前端,前端再根据数据的类型进行处理。下面是一个 SSE 的示例:
var source = new EventSource('url');
source.onmessage = function(event) {
console.log(event.data);
};其中 new EventSource('url') 参数为需要监听事件的地址,当服务端推送消息时,便会执行 source.onmessage 函数,这里是将消息数据打印到控制台。
下面我们将介绍如何利用 SSE 实现下拉滚动分页。
1.前端实现
当用户滑动页面到底部时,前端需要向后端请求数据。这里我们先假设后端接口为 /api/data,后端会返回数据数组,前端再将数组中的元素进行渲染。
// www.javascriptcn.com code example
let page = 1; // 当前页数
function loadData() {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
renderData(data);
page++;
}
};
xhr.open('GET', `/api/data?page=${page}`);
xhr.send();
}
function renderData(data) {
const list = document.getElementById('list');
data.forEach(item => {
const div = document.createElement('div');
div.innerText = item;
list.appendChild(div);
});
}这段代码逻辑比较简单,根据当前页数向后端请求数据,再处理数据进行渲染。
2.后端实现
后端需要实现 SSE 推送接口,当有新的数据需要推送时,将数据通过 SSE 推送到前端。
// www.javascriptcn.com code example
const http = require('http');
const server = http.createServer(function(req, res) {
if (req.url === '/api/data') {
const query = require('url').parse(req.url, true).query;
const page = query.page;
if (page === '1') { // 第一页使用常规请求返回数据
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write(JSON.stringify(['data1', 'data2', 'data3', 'data4', 'data5']));
res.end();
} else { // 后续分页使用 SSE 推送返回数据
res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache' });
setInterval(function() {
const data = ['data1', 'data2', 'data3', 'data4'];
res.write(`data: ${JSON.stringify(data)}\n\n`);
}, 1000); // 每隔一秒推送一次
}
}
});
server.listen(8080);这里需要注意的是 SSE 推送需要设置 Content-Type 为 text/event-stream,并且在返回数据前需要发送一个空行。推送数据时使用 res.write(),数据需要拼接在 data: 前,每次推送数据需要加一个空行。
3.前端接收 SSE 数据
前端需要监听 SSE 推送的数据,并将数据渲染到页面上。
const source = new EventSource('/api/data?page=2');
source.onmessage = function(event) {
const data = JSON.parse(event.data);
renderData(data);
};这里需要注意 new EventSource() 参数需要传入当前页数,以便后端知道需要推送哪一页的数据。当后端推送数据后,会触发 source.onmessage 函数,前端再将数据进行渲染。
以上就是如何利用 SSE 实现下拉滚动分页的方式,这种分页方式相比传统的分页方式能够更加减少用户等待时间。SSE 技术的运用,再加上对数据的处理能力,可以为分页加载功能提供更好的解决方案。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d7a589a941bf7134db2aa5