Skip to main content
Hầu hết ứng dụng chia sẻ các phần tử UI chung giữa nhiều trang như thanh điều hướng chính, sidebar hoặc footer. Layout component cho phép bạn định nghĩa UI dùng chung một lần rồi tự động bao bọc các trang bằng nó.

Tạo layout

Layout là component tiêu chuẩn nhận nội dung con. Không có gì đặc thù Inertia trong bản thân layout.
Bạn có thể dùng layout bằng cách trực tiếp bao nội dung trang bằng nó. Tuy nhiên cách này buộc instance layout bị hủy và tạo lại giữa các visit.

Layout duy trì xuyên suốt

Bao page bằng layout dưới dạng child component vẫn hoạt động, nhưng đồng nghĩa layout bị hủy và tạo lại ở mọi visit. Điều này ngăn duy trì layout state qua các lần điều hướng, chẳng hạn audio player cần tiếp tục phát hoặc sidebar cần giữ vị trí cuộn. Persistent layout giải quyết vấn đề này bằng cách cho Inertia biết layout nào được dùng cho page. Inertia quản lý instance layout riêng và giữ nó sống giữa các visit.

Nested layouts

Bạn có thể tạo bố cục layout phức tạp hơn bằng nested layout. Truyền một mảng layout component để bao page qua nhiều lớp.

Layout mặc định

Tùy chọn layout trong createInertiaApp cho phép định nghĩa layout mặc định cho mọi page, tránh phải khai báo ở từng page. Layout theo từng page luôn ưu tiên hơn layout mặc định.
Bạn cũng có thể trả layout có điều kiện dựa trên tên page. Ví dụ có thể muốn loại các public page khỏi layout mặc định.
Full page object cũng có sẵn dưới dạng đối số thứ hai, cho phép truy cập URL, props và metadata khác của page. Callback layout hỗ trợ mọi định dạng layout, bao gồm mảng cho nested layouts, object có tên cho named layouts, và tuple cho static props.

Sử dụng Resolve callback

Bạn cũng có thể đặt layout mặc định bên trong callback resolve bằng cách mutate page component đã resolve. Callback nhận tên component và full page object, hữu ích khi cần áp dụng layout có điều kiện dựa trên page data.

Layout props

Persistent layout thường cần dữ liệu động từ page hiện tại, chẳng hạn page title, navigation item đang active hoặc trạng thái bật/tắt sidebar. Layout prop cung cấp cách định nghĩa giá trị mặc định trong layout và override từ bất kỳ page nào.

Định nghĩa giá trị mặc định

Layout prop được định nghĩa như component prop thông thường với giá trị mặc định.

Static props

Bạn có thể truyền static prop trực tiếp trong định nghĩa persistent layout bằng tuple. Các prop này được đặt một lần khi layout được định nghĩa và không thay đổi giữa các lần điều hướng page.

Callback props

Đôi khi layout prop cần được suy ra từ prop của page hiện tại. Callback function nhận page props và trả về layout definition với static prop đã tính toán.
Callback nhận props của page và có thể trả bất kỳ định dạng layout hợp lệ nào: một component, tuple kèm static props, mảng cho nested layouts hoặc named layout object. Người dùng TypeScript có thể dùng type LayoutCallback để đảm bảo type safety.

Chỉ trả props

Khi default layout được cấu hình trong createInertiaApp, callback có thể trả plain props object thay vì full layout definition. Inertia tự động dùng default layout và merge các prop được trả vào layout đó.
Bạn cũng có thể dùng static object khi prop không phụ thuộc page data.

Dynamic props

Bạn cũng có thể cập nhật layout prop động từ bất kỳ page component nào bằng hàm setLayoutProps. Người dùng TypeScript có thể khai báo type cho các prop này trên toàn cục.

Nhắm đến named layouts

Nested layouts cũng có thể được định nghĩa dưới dạng named object thay vì mảng, cho phép nhắm tới layout cụ thể bằng prop.
Bạn có thể nhắm tới named layout cụ thể bằng cách truyền tên layout làm đối số đầu tiên của setLayoutProps.
Nested layouts và named layout cũng có thể bao gồm static prop bằng cú pháp tuple.

Thứ tự ưu tiên khi merge

Layout prop được resolve từ nhiều nguồn theo thứ tự ưu tiên sau, từ cao xuống thấp:
  1. Dynamic props - được đặt qua setLayoutProps()
  2. Static props - được định nghĩa trong persistent layout definition (bao gồm callback props)
  3. Defaults - được khai báo là giá trị mặc định trên prop của layout component

Tự động reset khi điều hướng

Dynamic layout prop tự động reset khi điều hướng tới page mới (trừ khi bật preserveState). Điều này đảm bảo mỗi page bắt đầu với trạng thái sạch và chỉ áp dụng các layout prop được page đó thiết lập rõ ràng.

Reset props

Bạn cũng có thể reset thủ công toàn bộ dynamic layout prop bằng resetLayoutProps.

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.