[英]SwiftUI 2 View Models in a View
我有这个观点,它以自己的观点 Model 作为参数。 在这个视图中,我需要显示另一个视图,为了显示它,需要它自己的视图 Model。 所以我展示了Purchase
视图,然后在Purchase
视图中我需要显示购买的实际项目的详细信息。 所以我也将ItemViewModel
作为参数传递。 PurchaseViewModel
和ItemViewModel
也用于其他视图。
它可能发生在我还需要ClientViewModel
的功能中,该模型将用于显示有关该商品的实际买家的数据。 这是否意味着我还需要将@ObservedObject var clientViewModel: ClientViewModel
作为参数传递?
我的问题是:这种方法好还是有更好的方法来做到这一点?
struct PurchaseView: View {
@ObservedObject var purchaseViewModel: PurchaseViewModel
@ObservedObject var itemViewModel: ItemViewModel
var body: some View {
VStack {
Text(purchaseViewModel.title)
ItemView(itemViewModel: itemViewModel)
}
}
}
class Purchase {
let senderID: String
let receiverID: String
var status: PurchaseStatus
var item: Item?
}
您可以让PurchaseViewModel
包含ItemViewModel
和ClientViewModel
作为属性,就像PurchaseView
包含ItemView
和ClientView
一样。
这将使PurchaseViewModel
负责创建其他视图模型的实例。 PurchaseView
的父级不再需要了解PurchaseView
的实现。
您应该首先考虑模型的关系,而不是视图模型。
例如,您可以假设Purchase
涉及一个或多个项目 ( Item
) 和购买者 ( Client
)。 在这种情况下,您实际上会创建一个 model 类似于:
class Purchase {
var items = [Item]()
var client: Client
...
}
您的PurchaseViewModel
将反映这一点,包含ItemViewModel
和ClientViewModel
let clientViewModel: ClientViewModel
let itemsViewModels: [ItemViewModel]
init(purchase: Purchase) {
self.clientViewModel = ClientViewModel(client:purchase.client)
self.itemsViewModels = purchase.items.map { ItemViewModel(item:$0) }
}
如果您有需要一些不相关模型的视图层次结构,那么您可以考虑使用环境,特别是对于“全局”模型
例如,假设用户正在查看项目详细信息,但他们还没有进行购买(因此还没有Purchase
),并且您希望有一个按钮向他们显示他们的Client
详细信息。
您可以将ItemViewModel
显式传递给ItemDetailView
:
struct ItemListView {
...
Button(action: { ItemDetailView(item:someItemView) })
{ ... }
}
struct ItemDetailView {
...
Button(action: { ClientView() }) {
Text("Client detail")
}
}
struct ClientDetailView {
@EnvironmentObject client: ClientViewModel
...
}
您可以在合适的位置将ClientViewModel
注入到环境中,例如根视图甚至场景委托。
如果您有需要这些模型的视图层次结构,但并非所有视图都需要所有模型,您可以使用环境来提供各种模型,而不是通过初始化参数直接注入它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.