Skip to main content

Search, filter & pagination không rối state

Sai lầm phổ biến là giữ search, status, page ở nhiều nơi cùng lúc: React state, URL và backend request. Khi đó Back/Forward, refresh hoặc copy URL rất dễ cho ra state khác nhau.

Backend

Closure ở usersroles cho phép Inertia tránh evaluate prop không được yêu cầu trong partial reload.

React với debounce

Vì sao dùng replace

Nếu mỗi ký tự search tạo một browser-history entry, nút Back sẽ đi qua t, tu, tua, tuan trước khi về trang trước. replace: true tránh biến search typing thành lịch sử điều hướng.

Khi nào dùng only

Nếu filter chỉ làm thay đổi users, không cần query lại danh mục vai trò, thống kê sidebar hoặc dữ liệu tham chiếu tốn nhiều tài nguyên để truy vấn. only: ['users', 'filters'] giúp request nhỏ hơn, nhưng chỉ hiệu quả khi server cũng lazy-evaluate prop.

Reset page khi đổi filter

Đừng gửi page cũ khi filter thay đổi. Hãy để request mới bắt đầu từ page 1. Pagination links do Laravel trả về đã mang query string hiện tại nên người dùng có thể tiếp tục sang page 2 mà không mất filter.

Checklist

  • URL giữ search/filter để refresh và share link vẫn đúng.
  • Local state chỉ giữ text tức thời trước debounce.
  • Debounce 250–400ms thường đủ cho search backend thông thường.
  • replace cho typing-driven navigation.
  • preserveState để input không mất focus/state.
  • only + server closure phải đi cùng nhau mới có lợi rõ ràng.

Normalize query để URL sạch

Không cần giữ giá trị default trên URL:
URL sạch giúp share link và cache/debug dễ hơn.

Server whitelist sort, không đưa column trực tiếp từ request vào SQL

Đây vừa là correctness vừa tránh dynamic SQL không kiểm soát.

Empty state phải biết filter context

“Chưa có dữ liệu” và “filter không tìm thấy” là hai UX khác nhau.

Pagination + filter regression

Khi filter đổi phải reset page:
Nếu không, user đang page 8 có thể filter xuống dataset chỉ còn 2 page rồi tưởng app lỗi vì list rỗng.

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

Nội dung thực chiến trong bài được xây dựng dựa trên API và nguyên lý của Inertia.js v3 Documentation. Khi áp dụng vào dự án, hãy đối chiếu API cụ thể với tài liệu chính thức theo phiên bản bạn đang sử dụng.