Skip to main content

Product CRUD: Advanced UX & failure modes

Một CRUD “nhanh” không chỉ là thêm spinner. Bạn cần hiểu state nào đang stale, request nào có thể overlap và response nào là canonical.

1. Partial reload không phải client cache tùy ý

Khi filter bảng:
Inertia merge prop mới vào page hiện tại. Các prop không request như stats vẫn giữ giá trị hiện có. Điều này tạo một câu hỏi quan trọng:
Stats có cần phản ánh filter hiện tại không?
Trong sample: không. Stats là global totals nên giữ nguyên được. Nếu stats phụ thuộc filter thì phải:
hoặc thiết kế lại semantics.

2. Deferred phải có fallback semantics

Có ba trạng thái phải nghĩ tới:
Nếu dùng rescue: true, thêm trạng thái logic thứ tư:
UI không nên giả định deferred data luôn tồn tại.

3. Prefetch có freshness trade-off

30 giây không có nghĩa dữ liệu chắc chắn mới 100%. Nó là trade-off giữa latency và freshness. Prefetch hợp với:
  • create page tĩnh;
  • edit page ít biến động;
  • navigation có probability cao.
Không hợp với:
  • dữ liệu cực nhạy thời gian;
  • hàng trăm link trên table được prefetch đồng loạt;
  • page cần nhiều truy vấn hoặc thời gian xử lý nhưng người dùng hiếm khi mở.

4. Optimistic update cần invariant nhỏ

Sample toggle:
Đây là invariant nhỏ và rollback được. Không nên dùng optimistic UI mặc định cho:
Trong các case đó, waiting state rõ ràng thường an toàn hơn.

5. preserveState không sửa được state ownership sai

Nếu URL là:
nhưng component local state lại là:
thì preserveState: true chỉ giữ inconsistency lâu hơn. Rule:

6. Search request overlap

Debounce giảm overlap nhưng không loại bỏ hoàn toàn. User có thể:
Inertia quản lý visit lifecycle, nhưng UI design vẫn nên tránh tạo nhiều nguồn phát request không phối hợp. Một pattern tốt là mọi filter đi qua cùng một function canonical:

7. Flash và recentlySuccessful phục vụ hai scope khác nhau

Create redirect index nên dùng flash. Inline autosave ở edit page có thể dùng recentlySuccessful.

8. Loading không nên blank toàn page

Sai:
Tốt hơn:
Nếu cần feedback, dùng subtle pending indicator thay vì phá layout.

9. Error boundary theo phạm vi

Phân biệt:
Không gom tất cả thành Something went wrong.

10. Khi CRUD lớn lên

Khi Product index có thêm:
  • bulk actions;
  • export;
  • column preferences;
  • inline editing;
  • background job status;
đừng lập tức chuyển thành SPA + REST API. Trước hết kiểm tra capability Inertia hiện có:
Chỉ tách API/client state layer khi requirement thực sự cần, không phải vì CRUD đã “nhiều JavaScript”.

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.