Skip to main content
Inertia cung cấp hai cách chính để xây dựng form: component <Form> và helper useForm. Cả hai tích hợp với validation của framework phía máy chủ và xử lý submit form mà không tải lại toàn bộ trang.

Component Form

Inertia cung cấp component <Form> hoạt động gần giống form HTML truyền thống nhưng sử dụng Inertia bên dưới để tránh tải lại toàn bộ trang. Đây là cách đơn giản nhất để bắt đầu làm việc với form trong Inertia.
Component cũng hỗ trợ cấu trúc dữ liệu lồng nhau, tải file và dotted key notation.
Bạn có thể truyền prop transform để sửa dữ liệu form trước khi submit. Điều này hữu ích khi cần chèn field bổ sung hoặc transform dữ liệu hiện có, dù hidden input cũng có thể dùng được.

Wayfinder

Khi dùng Wayfinder, bạn có thể truyền object kết quả trực tiếp vào prop action. Component Form sẽ tự suy ra HTTP method và URL từ object Wayfinder.

Giá trị mặc định

Input checkbox

Khi làm việc với checkbox, bạn có thể muốn thêm attribute value rõ ràng như value="1". Nếu không có value, checkbox được chọn sẽ submit thành "on", giá trị mà một số validation rule phía máy chủ có thể không nhận diện là boolean hợp lệ.

Slot props

Component <Form> expose reactive state và các helper method qua default slot, cho phép truy cập trạng thái xử lý form, lỗi và utility function.
Method defaults cho phép cập nhật giá trị mặc định của form theo giá trị field hiện tại. Sau khi gọi, các lần reset() tiếp theo sẽ khôi phục field về các mặc định mới này và property isDirty sẽ theo dõi thay đổi so với chúng. Khác với useForm, method này không nhận đối số và luôn dùng toàn bộ giá trị hiện tại của form. Object errors dùng dotted notation cho field lồng nhau, cho phép hiển thị validation message cho cấu trúc form phức tạp.

Props và options

Ngoài actionmethod, component <Form> nhận thêm nhiều prop. Nhiều prop giống các tùy chọn có trong visit options của Inertia.
Một số prop được chủ ý nhóm dưới options thay vì đặt top-level để tránh nhầm lẫn. Ví dụ only, exceptreset liên quan tới partial reload, không phải partial submission. Quy tắc chung: top-level prop dành cho chính việc gửi form, còn options kiểm soát cách Inertia xử lý visit tiếp theo. Để style form trong lúc đang xử lý, bạn có thể target form inert theo các cách sau.

Sự kiện

Component <Form> phát toàn bộ event visit tiêu chuẩn khi gửi form.

Reset form

Component Form cung cấp một số attribute cho phép reset form sau khi submit. Có thể dùng resetOnSuccess để reset form sau khi submit thành công.
Có thể dùng resetOnError để reset form sau khi xảy ra lỗi.

Thiết lập giá trị mặc định mới

Component Form cung cấp attribute setDefaultsOnSuccess để đặt các giá trị hiện tại của form làm mặc định mới sau khi submit thành công.

Hủy submit form

Phương thức cancel hủy submission đang chạy. Nó có sẵn qua slot props, component refform context.
Submission tiếp tục chạy ngay cả khi form khởi tạo nó bị gỡ khỏi page. Điều hướng đi nơi khác sẽ hủy submission, nhưng đóng modal chứa form thì không, vì vậy upload bị bỏ dở vẫn hoàn tất. Bạn có thể dùng thuộc tính cancelOnUnmount để hủy submission đang chạy ngay khi form unmount.

Dotted key notation

Component <Form> hỗ trợ dotted key notation để tạo object lồng nhau từ tên input phẳng. Đây là cách thuận tiện để tổ chức dữ liệu form.
Ví dụ trên sẽ tạo ra cấu trúc dữ liệu sau.
Nếu cần dấu chấm literal trong tên field (không dùng làm dấu phân tách object lồng nhau), bạn có thể escape bằng dấu gạch chéo ngược.
Ví dụ trên sẽ tạo ra cấu trúc dữ liệu sau.

Truy cập bằng code

Bạn có thể truy cập các method của form bằng code thông qua ref. Đây là lựa chọn thay thế cho slot props khi cần kích hoạt action của form từ bên ngoài form.
Trong React và Vue, ref cho phép truy cập toàn bộ method và reactive state của form. Trong Svelte, ref chỉ expose method, vì vậy reactive state như isDirtyerrors nên được truy cập qua slot props.

Form context

Child component lồng sâu có thể cần truy cập form state hoặc method mà không truyền prop qua nhiều tầng. Hook useFormContext cung cấp quyền truy cập state và method của component <Form> cha từ bất kỳ child component nào.
Context cung cấp đầy đủ property và method giống như slot props.
Cả component <Form>useFormContext đều nhận generic type parameter để có error và slot prop type-safe. Xem tài liệu TypeScript để biết chi tiết.

Precognition

Component <Form> tích hợp sẵn hỗ trợ Laravel Precognition, cho phép validation form theo thời gian thực mà không cần sao chép validation rule phía máy chủ sang client.
Precognition yêu cầu hỗ trợ phía server. Người dùng Laravel nên xem tài liệu Laravel Precognition để biết cách thiết lập. Với framework khác, xem trang protocol để biết chi tiết implementation. chi tiết.
Sau khi cấu hình máy chủ, gọi validate() với tên field để kích hoạt validation cho field đó. Helper invalid() kiểm tra field có lỗi validation hay không, còn validating cho biết request đang được xử lý.
Bạn cũng có thể dùng helper valid() để kiểm tra field đã pass validation hay chưa.
Form input chỉ xuất hiện trạng thái valid hoặc invalid sau khi giá trị đã thay đổi và đã nhận validation response. Gọi validate('field') sẽ không gửi validation request cho tới khi giá trị field khác dữ liệu ban đầu.

Validation nhiều field

Bạn có thể validation nhiều field cùng lúc bằng tùy chọn only. Điều này đặc biệt hữu ích khi xây dựng form dạng wizard, nơi bạn muốn validation toàn bộ field đang hiển thị trước khi sang bước tiếp theo.

Touch và validate

Method touch() đánh dấu các field là “touched” mà không kích hoạt validation. Sau đó bạn có thể validation tất cả field đã touched bằng cách gọi validate() không có đối số.
Helper touched() cũng có thể được gọi không đối số để kiểm tra có field nào đã touched hay chưa. Method reset() xóa touched state của các field được reset.

Options

Method validate() nhận object options chứa callback và cấu hình.
Bạn cũng có thể gọi validate() chỉ với object options để validation các field cụ thể.
Request validation tự động được debounce. Request đầu tiên chạy ngay lập tức, các thay đổi tiếp theo được debounce (mặc định 1500ms). Bạn có thể tùy chỉnh timeout này.
Mặc định, file bị loại khỏi request validation để tránh upload không cần thiết. Bạn có thể bật validation file khi cần kiểm tra input file như kích thước hoặc MIME type.
Mặc định, lỗi validation được đơn giản hóa thành chuỗi (message lỗi đầu tiên). Bạn có thể giữ lỗi dưới dạng array để hiển thị toàn bộ message cho field có nhiều validation rule.

Form helper

Ngoài component <Form>, Inertia còn cung cấp helper useForm khi bạn cần kiểm soát bằng code đối với dữ liệu form và hành vi submit.
Để gửi form, bạn có thể dùng các phương thức get, post, put, patchdelete.
Các submit method hỗ trợ mọi visit option thông thường như preserveState, preserveScroll và event callback, hữu ích để thực hiện tác vụ sau khi gửi form thành công. Ví dụ, bạn có thể dùng callback onSuccess để reset input về state ban đầu.
Bạn có thể truyền HTTP method và URL làm hai đối số đầu tiên cho useForm(), sau đó gọi submit() không đối số để gửi request. Cách này cũng mở khóa validation theo thời gian thực. Xem Precognition để biết chi tiết. Nếu cần thay đổi dữ liệu form trước khi gửi đến máy chủ, bạn có thể thực hiện thông qua phương thức transform().
Bạn có thể dùng thuộc tính processing để theo dõi form có đang được submit hay không. Điều này hữu ích để ngăn submit hai lần bằng cách disable nút submit.
Nếu form đang tải file lên, sự kiện tiến trình hiện tại có sẵn thông qua thuộc tính progress, giúp bạn dễ dàng hiển thị tiến độ tải lên.

Lỗi form

Nếu có form validation error, chúng có sẵn qua thuộc tính errors. Khi xây ứng dụng Inertia dùng Laravel, form error tự động được điền khi ứng dụng ném instance ValidationException, chẳng hạn khi dùng {'$request->validate()'}.
Để tìm hiểu kỹ hơn về form validation và error, xem tài liệu validation. Để xác định form có lỗi hay không, bạn có thể dùng thuộc tính hasErrors. Để xóa lỗi form, dùng phương thức clearErrors().
Nếu dùng thư viện validation input phía client hoặc tự validation phía client, bạn có thể tự đặt lỗi cho form bằng method setErrors().
Khác với một lần submit form thực tế, props của trang không thay đổi khi bạn tự đặt lỗi trên một instance form. Khi form được submit thành công, thuộc tính wasSuccessful sẽ là true. Ngoài ra, form còn có thuộc tính recentlySuccessful, được đặt thành true trong hai giây sau một lần submit thành công. Bạn có thể dùng thuộc tính này để hiển thị thông báo thành công tạm thời. Bạn có thể tùy chỉnh thời lượng state recentlySuccessful bằng cách đặt tùy chọn form.recentlySuccessfulDuration trong cấu hình mặc định của ứng dụng. Giá trị mặc định là 2000 millisecond.

Reset form

Để reset các giá trị của form về giá trị mặc định, bạn có thể dùng phương thức reset().
Đôi khi bạn muốn vừa khôi phục field về giá trị mặc định vừa xóa mọi lỗi validation. Thay vì gọi riêng reset()clearErrors(), có thể dùng method resetAndClearErrors() để kết hợp cả hai hành động trong một lần gọi.

Thiết lập giá trị mặc định mới

Nếu các giá trị mặc định của form không còn phù hợp, bạn có thể dùng phương thức defaults() để cập nhật chúng. Sau đó, form sẽ được reset về đúng các giá trị này trong lần tiếp theo phương thức reset() được gọi.

Theo dõi thay đổi field của form

Để xác định form có thay đổi nào hay không, bạn có thể dùng thuộc tính isDirty.

Hủy submit form

Để hủy một lần submit form, dùng phương thức cancel().

Dữ liệu form và history state

Để yêu cầu Inertia lưu data và error của form vào history state, bạn có thể cung cấp form key duy nhất làm đối số đầu tiên khi tạo form.

Loại trừ field

Các field nhạy cảm như password có thể được loại khỏi history state bằng phương thức dontRemember().
Có thể loại trừ nhiều field bằng cách truyền thêm đối số.
Một số trình duyệt kích hoạt hộp thoại “save password” bất cứ khi nào giá trị password field được ghi vào history state, kể cả không gửi form. Loại password field giúp tránh vấn đề này.

Wayfinder

Khi dùng Wayfinder cùng form helper, bạn chỉ cần truyền object kết quả trực tiếp vào method form.submit. Form helper sẽ suy ra HTTP method và URL từ object Wayfinder.

Precognition

Tương tự component <Form>, helper useForm hỗ trợ Precognition cho validation thời gian thực. Bạn có thể bật bằng cách chain method withPrecognition() với HTTP method và endpoint dành cho request validation.
Precognition yêu cầu hỗ trợ phía server. Người dùng Laravel nên xem tài liệu Laravel Precognition để biết cách thiết lập. Với framework khác, xem trang protocol để biết chi tiết implementation. chi tiết.
Để tương thích ngược với package laravel-precognition, bạn cũng có thể truyền method và URL làm các đối số đầu tiên cho useForm().
Vì Precognition giờ đã tích hợp sẵn, bạn có thể gỡ package laravel-precognition và import useForm từ Inertia adapter thay thế.
Bạn cũng có thể dùng Wayfinder khi bật Precognition.
Sau khi bật Precognition, gọi validate() với tên field để kích hoạt validation cho field đó. Helper invalid() kiểm tra field có lỗi validation hay không, còn validating cho biết request đang chạy.
Bạn cũng có thể dùng helper valid() để kiểm tra field đã pass validation hay chưa.

Touch và validate

Method touch() đánh dấu field là “touched” mà không kích hoạt validation. Sau đó bạn có thể validation toàn bộ field touched bằng cách gọi validate() không đối số. Helper touched() kiểm tra field đã touched hay chưa. Method reset() xóa touched state cho các field được reset.

Options

Request validation tự động được debounce. Request đầu tiên chạy ngay, các thay đổi tiếp theo được debounce (mặc định 1500ms). Bạn có thể tùy chỉnh timeout bằng setValidationTimeout().
Mặc định, file bị loại khỏi request validation để tránh upload không cần thiết. Bạn có thể bật validation file bằng validateFiles().
Mặc định, lỗi validation được đơn giản hóa thành chuỗi (message lỗi đầu tiên). Bạn có thể yêu cầu nhận toàn bộ lỗi dưới dạng array bằng withAllErrors().
Khi Precognition được bật, bạn có thể gọi submit() không cần đối số để gửi request tới endpoint đã cấu hình.

Response phía máy chủ

Khi dùng Inertia, bạn thường không kiểm tra form response ở phía client như với request XHR/fetch truyền thống. Thay vào đó, route hoặc controller phía server trả redirect sau khi xử lý form, thường redirect tới trang thành công.
Cách tiếp cận dựa trên redirect này hoạt động với mọi phương thức submit form: component <Form>, helper useForm và submit thủ công bằng router. Nó khiến việc xử lý form Inertia rất giống submit form truyền thống phía máy chủ.

Validation phía máy chủ

Cả component <Form> và helper useForm đều tự động xử lý lỗi validation phía máy chủ. Khi máy chủ trả lỗi validation, chúng tự động có trong object errors mà không cần cấu hình thêm. Khác với request XHR/fetch truyền thống nơi bạn có thể kiểm tra status code 422, Inertia xử lý lỗi validation như một phần của flow dựa trên redirect, giống submit form truyền thống phía máy chủ nhưng không tải lại toàn bộ trang. Để xem hướng dẫn đầy đủ về xử lý validation error, bao gồm error bag và các trường hợp nâng cao, xem tài liệu validation.

Submit form thủ công

Bạn cũng có thể submit form thủ công bằng trực tiếp các method router của Inertia mà không dùng component <Form> hoặc helper useForm:

Tải file lên

Khi gửi request hoặc form có file, Inertia tự động chuyển request data thành object FormData. Cơ chế này hoạt động với component <Form>, helper useForm và manual router submission. Để biết thêm về upload file, bao gồm theo dõi tiến trình, xem tài liệu file uploads.

Optimistic updates

Cả component <Form> và helper useForm đều hỗ trợ optimistic update, cho phép cập nhật UI ngay trước khi server phản hồi. Xem tài liệu optimistic updates để biết thêm.

Submission không qua Inertia

Dùng Inertia để gửi form phù hợp với phần lớn tình huống. Với HTTP request độc lập không kích hoạt page visit, bạn có thể dùng hook useHttp, cung cấp trải nghiệm phát triển tương tự useForm. Bạn cũng có thể tự do dùng XHR hoặc fetch thông thường với thư viện tùy chọn.

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.