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
users và roles 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ửipage 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.
replacecho 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:Server whitelist sort, không đưa column trực tiếp từ request vào SQL
Empty state phải biết filter context
Pagination + filter regression
Khi filter đổi phải resetpage: