Skip to main content
Tính năng infinite scroll của Inertia tải thêm các trang nội dung khi người dùng cuộn, thay thế control phân trang truyền thống. Tính năng này phù hợp cho giao diện chat, social feed, lưới ảnh và danh sách sản phẩm.

Phía máy chủ

Để cấu hình dữ liệu phân trang cho infinite scrolling, bạn nên dùng phương thức Inertia::scroll() khi trả response. Phương thức tự động cấu hình hành vi merge phù hợp và chuẩn hóa pagination metadata cho frontend component.
Method Inertia::scroll() hoạt động với các method paginate(), simplePaginate()cursorPaginate() của Laravel, cũng như dữ liệu phân trang được bọc trong Eloquent API resource. Xem tài liệu method Inertia::scroll() để biết thêm.

Phía client

Ở phía client, Inertia cung cấp component <InfiniteScroll> để tự động tải thêm các trang nội dung. Component nhận prop data chỉ định key của prop chứa dữ liệu phân trang. Component <InfiniteScroll> cần bọc nội dung phụ thuộc vào dữ liệu này.
Component dùng Intersection Observer để phát hiện khi người dùng cuộn gần cuối nội dung và tự động kích hoạt request tải page tiếp theo. Dữ liệu mới được merge với nội dung hiện có thay vì thay thế.

Loading buffer

Bạn có thể kiểm soát việc tải nội dung bắt đầu sớm đến mức nào bằng khoảng buffer. Buffer chỉ định số pixel trước cuối nội dung mà quá trình tải cần bắt đầu.
Trong ví dụ trên, nội dung bắt đầu tải khi còn cách cuối phần hiện tại 500 pixel. Buffer lớn hơn tải nội dung sớm hơn nhưng có thể tải cả nội dung người dùng không bao giờ xem.

Đồng bộ URL

Component infinite scroll cập nhật query string URL của trình duyệt (?page=...) khi người dùng cuộn qua nội dung. URL phản ánh trang có nhiều item hiển thị nhất trên màn hình và cập nhật theo cả hai hướng khi cuộn lên hoặc xuống. Nhờ đó người dùng có thể bookmark hoặc chia sẻ liên kết đến trang cụ thể. Bạn có thể tắt hành vi này để giữ nguyên URL ban đầu.
Điều này hữu ích khi infinite scroll được dùng cho nội dung phụ không nên ảnh hưởng URL chính của trang, chẳng hạn comment của bài blog hoặc sản phẩm liên quan.

Reset

Khi filter hoặc tham số khác thay đổi, bạn có thể cần reset dữ liệu infinite scroll để bắt đầu lại từ đầu. Nếu không reset, kết quả mới sẽ merge với nội dung hiện tại thay vì thay thế. Bạn có thể reset dữ liệu bằng visit option reset.
Để biết thêm về tùy chọn reset, xem tài liệu Resetting props.

Hướng tải dữ liệu

Component infinite scroll tải nội dung theo cả hai hướng khi bạn cuộn gần đầu hoặc cuối. Bạn có thể kiểm soát bằng các prop only-nextonly-previous.
Option mặc định đặc biệt hữu ích khi người dùng bắt đầu ở một trang giữa và cần cuộn theo cả hai hướng để truy cập toàn bộ nội dung.

Reverse mode

Với ứng dụng chat, timeline hoặc giao diện có nội dung sắp xếp giảm dần (item mới nhất ở dưới cùng), bạn có thể bật reverse mode. Chế độ này cấu hình component tải nội dung cũ hơn khi cuộn lên.
Trong reverse mode, component đảo hướng tải: cuộn lên tải trang kế tiếp (nội dung cũ hơn), cuộn xuống tải trang trước (nội dung mới hơn). Component xử lý vị trí khi loading, nhưng bạn chịu trách nhiệm đảo thứ tự nội dung để hiển thị đúng. Reverse mode cũng tự động cuộn xuống cuối ở lần tải đầu tiên; bạn có thể tắt bằng :auto-scroll="false".

Manual mode

Manual mode tắt tự động tải khi cuộn và cho phép bạn kiểm soát thời điểm tải nội dung qua slot nextprevious. Để biết chi tiết property slot và option tùy chỉnh, xem Slots.
Bạn cũng có thể cấu hình component tự chuyển sang manual mode sau một số lượng trang nhất định bằng prop manualAfter.

Slots

Component infinite scroll cung cấp nhiều slot để tùy chỉnh trải nghiệm loading. Các slot cho phép hiển thị loading indicator tùy chỉnh và tạo control tải thủ công. Mỗi slot nhận property cung cấp thông tin trạng thái loading và function kích hoạt tải nội dung.

Default slot

Khu vực nội dung chính nơi bạn render item dữ liệu. Slot này nhận thông tin trạng thái loading.

Loading slot

Loading slot được dùng làm fallback khi đang tải nội dung và không có custom slot before hoặc after. Nó tạo loading indicator mặc định.

Slot Previous và Next

Slot previousnext được render phía trên và dưới nội dung chính, thường dùng làm control tải thủ công. Các slot nhận nhiều property gồm trạng thái loading, function fetch và chỉ báo mode.
Các slot loading, previousnext nhận những property sau:

Custom element

Component InfiniteScroll render dưới dạng phần tử <div>. Bạn có thể tùy chỉnh thành bất kỳ element HTML nào bằng prop as.

Target element

Component infinite scroll tự động theo dõi nội dung và gán số trang cho element để đồng bộ URL. Khi item dữ liệu không phải child trực tiếp của root element của component, bạn cần chỉ định element thực sự chứa item bằng prop itemsElement.
Trong ví dụ này, component theo dõi element #table-body và tự động gắn số trang cho từng <tr> khi nội dung mới được tải. Điều này cho phép URL cập nhật chính xác dựa trên nội dung của trang nào đang hiển thị nhiều nhất trong viewport. Bạn cũng có thể chỉ định custom trigger element để tải thêm nội dung bằng CSS selector. Khi đó các trigger element mặc định sẽ không được render và Intersection Observer sẽ theo dõi custom element thay thế.
Ngoài ra, bạn có thể dùng template ref thay cho CSS selector. Cách này tránh phải thêm HTML attribute và cung cấp tham chiếu element trực tiếp.

Scroll container

Component infinite scroll hoạt động trong bất kỳ container có thể cuộn nào, không chỉ document chính. Component tự động thích nghi để dùng custom scroll container cho việc phát hiện trigger và tính toán thay cho scroll của document chính.

Nhiều scroll container

Đôi khi bạn cần render nhiều component infinite scroll trên cùng một trang. Tuy nhiên, nếu cả hai đều dùng query parameter page mặc định để đồng bộ URL, chúng sẽ xung đột. Để giải quyết, hãy yêu cầu mỗi paginator dùng pageName riêng.
Method Inertia::scroll() tự động phát hiện pageName từ từng paginator, cho phép các scroll container duy trì pagination state độc lập. Kết quả URL sẽ có dạng ?users=2&orders=3 thay vì xung đột ở parameter ?page=. Để biết thêm về page name của pagination, xem tài liệu Laravel.

Truy cập bằng code

Khi cần kích hoạt action tải dữ liệu bằng code, bạn có thể dùng template ref.
Component expose các method sau:
  • fetchNext() - Chủ động lấy trang tiếp theo
  • fetchPrevious() - Chủ động lấy trang trước
  • hasNext() - Có trang tiếp theo hay không
  • hasPrevious() - Có trang trước hay không

Method Inertia::scroll()

Phương thức Inertia::scroll() cung cấp cấu hình phía server cho infinite scrolling. Nó tự động cấu hình merge để dữ liệu mới được append hoặc prepend vào nội dung hiện có thay vì thay thế, đồng thời chuẩn hóa pagination metadata cho frontend component.
Nếu không dùng paginator của Laravel hoặc dùng transformation layer khác, bạn có thể sử dụng các đối số bổ sung mà scroll() hỗ trợ.
Tham số metadata nhận instance ProvidesScrollMetadata hoặc callback trả về instance đó. Callback nhận tham số $data. Điều này hữu ích khi tích hợp thư viện pagination bên thứ ba như Fractal.
Sau đó bạn có thể dùng custom metadata provider này trong scroll function.
Để tránh lặp setup này trong nhiều controller, bạn có thể định nghĩa macro.

Tài liệu chính thức

Bài dịch này được đối chiếu từ tài liệu Inertia.js v3 chính thức. Nếu có khác biệt do phiên bản hoặc cập nhật mới, hãy ưu tiên tài liệu chính thức làm nguồn tham chiếu.