Kiểu dữ liệu của mỗi trang
OptionalbuildTuỳ chỉnh components (buttons, select menu)
Context build components
Dùng khi:
Builder dùng để tạo và chỉnh sửa components.
Dữ liệu của trang hiện tại.
Đây là kết quả từ PaginationBuilder.getPageData.
Có thể là array, object, hoặc bất kỳ kiểu dữ liệu generic T.
Trang hiện tại (bắt đầu từ 1).
Instance hiện tại của PaginationBuilder.
Tổng số trang có sẵn.
// Custom thêm button
const pagination = new PaginationBuilder<string[]>({
pages: ["Trang 1: Hello", "Trang 2: World", "Trang 3: Pagination"],
renderPage: ({ data }) => ({
content: data
}),
buildComponents: ({ components }) => {
components.addButton([
{
customId: "custom:hello",
label: "Hello",
style: "Success"
}
]);
return components;
}
});
OptionalinteractionFilter interaction
Dùng để:
OptionalnavigationCấu hình navigation buttons
Bật/tắt các nút:
OptionalonXử lý interaction custom (ngoài navigation mặc định)
Context interaction
Data của trang hiện tại
Đây là kết quả từ PaginationBuilder.getPageData
Có thể là:
TInteraction từ button hoặc select menu
Trang hiện tại (bắt đầu từ 1)
Instance pagination
Tổng số trang
Được gọi khi user tương tác với:
Không xử lý các action mặc định như next/prev nếu bạn không override.
Dùng khi:
// Handle button custom
const pagination = new PaginationBuilder<string[]>({
pages: ["Trang 1", "Trang 2"],
renderPage: ({ data }) => ({ content: data }),
buildComponents: ({ components }) => {
components.addButton([
{
customId: "custom:hello",
label: "Hello",
style: "Success"
}
]);
return components;
},
onComponent: async ({ interaction }) => {
if (interaction.customId === "custom:hello") {
await interaction.reply("Hello!");
}
}
});
OptionalonCallback xử lý lỗi toàn cục.
OptionalonCallback được gọi mỗi khi page thay đổi.
OnPageChangeContext
Dữ liệu của trang hiện tại.
Đây là kết quả từ PaginationBuilder.getPageData.
Có thể là array, object, hoặc bất kỳ kiểu dữ liệu generic T.
Interaction đã trigger việc đổi trang.
Trang mới sau khi thay đổi.
Trang trước đó.
Instance hiện tại của PaginationBuilder.
Có thể trả về Promise hoặc giá trị bất kỳ (không được sử dụng nội bộ)
Hook này chạy sau khi page đã được cập nhật, thường được dùng để:
⚠️ Lưu ý:
pagination.page trong hook này// Tracking user interaction
onPageChange: async ({ interaction, newPage }) => {
await logToDatabase({
userId: interaction.user.id,
page: newPage
});
}
OptionalonCallback được gọi khi pagination bắt đầu.
Dữ liệu của trang hiện tại.
Đây là kết quả từ PaginationBuilder.getPageData.
Có thể là array, object, hoặc bất kỳ kiểu dữ liệu generic T.
Message đã được gửi và gắn với pagination.
Instance hiện tại của PaginationBuilder.
Có thể trả về Promise hoặc giá trị bất kỳ (không được sử dụng nội bộ)
Hook này chạy sau khi message đã được gửi và pagination đã được khởi tạo hoàn chỉnh.
Thường dùng để:
⚠️ Lưu ý:
reload() liên tục → có thể gây spam API// Lưu message để dùng sau
onStart: ({ message, pagination }) => {
pagination.state.messageId = message.id;
}
OptionalonCallback được gọi khi pagination dừng.
Hook này chạy khi collector bị stop (thủ công hoặc do timeout).
Thường dùng để:
⚠️ Lưu ý:
OptionalonCallback được gọi khi pagination hết thời gian (timeout).
Hook này chạy khi collector tự động stop do vượt quá timeout.
Thường dùng để:
⚠️ Lưu ý:
OptionalpageHàm bất đồng bộ dùng để load dữ liệu cho từng trang
Đây là nguồn dữ liệu động (dynamic data source) cho pagination.
Khi sử dụng pageLoader:
totalPagesDùng trong các trường hợp:
pageLoader(page) sẽ được gọirenderPage⚠️ Lưu ý:
page là 0-based, không phải 1-basedTonError// Dùng với database
pageLoader: async (page) => {
return await db.getUsers({
skip: page * 10,
limit: 10
});
}
// Dùng với REST API
totalPages: 5,
pageLoader: async (page) => {
const res = await fetch(`/api/items?page=${page + 1}`);
const json = await res.json();
return json.data;
}
OptionalpagesDanh sách dữ liệu tĩnh cho từng trang
Dùng khi bạn đã có sẵn toàn bộ dữ liệu. Pagination sẽ truy cập trực tiếp từ mảng này.
⚠️ Không nên dùng nếu dữ liệu lớn (nên dùng pageLoader)
Hàm render nội dung của trang
OptionalselectCấu hình select menu (dropdown) cho pagination.
Optionalenabled?: booleanBật/tắt select menu.
OptionalpageLabel?: (page: number) => stringHàm dùng để format label cho từng option (trang).
Optionalplaceholder?: stringNội dung placeholder của select menu.
OptionaltimeoutThời gian timeout của pagination (tính bằng giây).
OptionaltotalTổng số trang (dùng với pageLoader)
Bắt buộc khi bạn dùng pageLoader.
Vì pagination không biết trước số trang nếu load động.
OptionaluseBật / tắt cơ chế cache dữ liệu page
Tùy chọn này chỉ có hiệu lực khi bạn sử dụng pageLoader.
Nếu bạn sử dụng pages (static data) thì cache sẽ không được dùng.
Khi useCache = true, dữ liệu của từng page sẽ được lưu lại sau lần load đầu tiên
thông qua pageLoader, nhằm tránh việc gọi lại nhiều lần cho cùng một page.
Cơ chế hoạt động:
getPageData(page)pageCache → trả về ngay (cache hit)pageLoader(page) để lấy dữ liệu (cache miss)useCache)Phù hợp khi:
Không nên bật khi:
const pagination = new PaginationBuilder({
pageLoader: async (page) => {
return fetchData(page); // gọi API
},
useCache: true
});
// Lần đầu → gọi API
await pagination.getPageData(0);
// Lần sau → dùng cache (không gọi lại API)
await pagination.getPageData(0);
Cấu hình cho PaginationBuilder
Remarks
Pagination hỗ trợ 2 chế độ dữ liệu (data source):
1. Dữ liệu tĩnh (
pages)2. Dữ liệu động (
pageLoader)⚠️ Chỉ nên dùng một trong hai:
pageshoặcpageLoader + totalPagesExample
Example