Trạng thái và luồng dữ liệu
Ai sở hữu giá trị, và ai được phép đổi nó
Mọi property wrapper trong SwiftUI đều trả lời đúng một câu hỏi: ai sở hữu giá trị này, và ai được phép đổi nó? Chọn nhầm hiếm khi sinh ra lỗi biên dịch. Nó sinh ra một view không cập nhật, hoặc một view cập nhật nhiều quá mức, hoặc trạng thái bị đặt lại trong khi chẳng ai yêu cầu.
| Wrapper | Chủ sở hữu | Dùng cho |
|---|---|---|
@State |
chính view này | trạng thái kiểu giá trị mà riêng view này giữ |
@Binding |
người khác | một tay cầm hai chiều được truyền xuống |
@Observable / @Bindable |
một kiểu tham chiếu | đối tượng mô hình dùng chung nhiều view |
@Environment |
môi trường | giá trị được truyền xuống ngầm |
Ba chương ở đây tháo cái bảng đó ra.
Ai sở hữu giá trị là quy trình quyết định — @State so với @Binding so với một đối tượng mô
hình — và triệu chứng cụ thể mà mỗi câu trả lời sai sinh ra, để bạn đọc ngược từ một lỗi về đến chỗ
sai.
Observation nói @Observable thật ra làm gì: SwiftUI biết một view đã đọc những thuộc tính nào
bằng cách nào, và vì sao điều đó khiến ObservableObject cùng @Published trở nên lỗi thời chứ
không chỉ là dài dòng hơn.
Environment là tiêm phụ thuộc đi xuống theo cây view — thứ gì thuộc về nó, thứ gì rất không thuộc về nó, và cách tự thêm một khóa của riêng bạn.
Một quy tắc đáng mang theo vào cả ba chương: trạng thái thuộc về view thấp nhất cần đến nó, và không thấp hơn. Cao quá thì những view chẳng liên quan cũng vẽ lại vì những thay đổi không dính dáng đến chúng. Thấp quá thì không chia sẻ được, nên bạn phải luồn binding qua năm lớp view chẳng quan tâm.