Это не совсем React, но я верю, что вы можете извлечь логику. Я только что реализовал нечто похожее на то, что вам нужно в последнее время.
Обратите внимание: pageIndex - это currentPageIndex и начинается с 0. Страницы, возвращаемые в массиве, начинаются с 1, для лучшего взаимодействия с пользователем.
const getLastPageIndex = function (totalNumberOfItems, pageSize) {
return Math.floor((totalNumberOfItems + pageSize - 1) / pageSize) - 1;
}
const getPageIndexOptions = function (totalNumberOfItems, maxNumberOfOptions, pageSize, pageIndex) {
const options = [];
const pivot = Math.ceil(maxNumberOfOptions/2);
const lastPageIndex = getLastPageIndex(totalNumberOfItems, pageSize);
if (lastPageIndex <= maxNumberOfOptions) {
while(options.length < lastPageIndex) options.push(options.length + 1);
} else if (pageIndex < pivot) {
while(options.length < maxNumberOfOptions) options.push(options.length + 1);
} else if (pageIndex > (lastPageIndex - pivot)) {
while(options.length < maxNumberOfOptions) options.unshift(lastPageIndex - options.length + 1);
} else {
for (var i = pageIndex - (pivot - 1); options.length < maxNumberOfOptions; i++) {
options.push(i + 1);
}
}
return options;
}
getPageIndexOptions(100, 5, 15, 0) // returns [1, 2, 3, 4, 5]
getPageIndexOptions (100, 5, 15, 4) // returns [3, 4, 5, 6, 7]