分页加载时如何动态计算起始索引?
在React项目里实现分页加载,发现计算起始索引的公式有问题。我用了startIndex = (page - 1) * pageSize,但切换页码时数据会重复显示,比如从第3页跳到第1页后列表还是显示第2页的内容。
尝试把分页逻辑写成这样:
const handlePageChange = (newPage) => {
const startIndex = (newPage - 1) * pageSize;
fetchItems(startIndex, pageSize);
setPage(newPage);
};
但发现当快速点击页码时,请求的startIndex和当前页码对不上。比如点击第5页时startIndex还是第4页的值。重置了状态变量也没解决,是不是需要加防抖或者调整状态更新顺序?
setPage(newPage)后直接用newPage去请求数据可能会有问题。可以调整一下逻辑,把startIndex的计算直接放在请求函数里,避免依赖外部状态。另外,快速点击分页时可能会导致请求错乱,建议加一个取消之前的请求机制,可以用
AbortController来处理,防止无效的旧请求覆盖新请求的结果。试试下面的代码:
这样写不仅解决了状态异步的问题,还加了请求取消机制,防止快速点击分页时出现混乱。记得服务端也要对参数做验证,防止注入之类的攻击。
setPage(newPage)后立马用newPage去计算startIndex可能会拿到错误的值。前端这块有个常见的解决办法:直接在
handlePageChange里传入需要的参数,而不是依赖外部的状态变量。改写成这样:另外,快速点击的问题可以通过加一个简单的防抖或节流来处理,但更推荐的方式是禁用正在加载中的按钮,或者给分页组件加个loading状态,避免用户连续触发请求。
最后提醒一下,确保
fetchItems里的逻辑不会缓存旧的参数,有时候后端也会有延迟导致数据不对齐。