繁体   English   中英

SwiftUI 可以将 ObservableObject 放入另一个 ObservableObject 中吗?

[英]SwiftUI Is it ok to put an ObservableObject inside another ObservableObject?

我有一个名为PurchaseView的视图。 此视图显示有关购买、购买的内容和购买者的详细信息。 我正在做的是,在这个视图中,我将ItemViewClientView都放在PurchaseView中。 ItemViewClientView是共享的,并且在我的应用程序的其他部分中使用。 他们有自己的 ViewModel。

我也尝试将ItemViewModelClientViewModel放入PurchaseViewModel但我不知道是否可以将ObservableObject放入另一个ObservableObject 这是一个好方法还是ObservableObject内不应该有任何ObservableObject 以下哪一项更好?

这个?

class PurchaseViewModel: ObservableObject {
    let clientViewModel: ClientViewModel
    let itemsViewModel: ItemViewModel

    //
}

或这个?

struct PurchaseView: View {
    @ObservedObject var purchaseViewModel: PurchaseViewModel
    @ObservedObject var itemViewModel: ItemViewModel
    @ObservedObject var clientViewModel: ClientViewModel

    var body: some View {
        //
    }
}

购买 model:

class Purchase {
    let id: String
    let total: Double
    // ...
    var item: Item?
    var client: Client?
}

您的第一个解决方案将不起作用,因为对嵌套 ObservableObjects 的更改不会向上传播:

class PurchaseViewModel: ObservableObject {
    let clientViewModel: ClientViewModel
    let itemsViewModel: ItemViewModel
    ...
}

可以在此处找到解决方法:如何告诉 SwiftUI 视图绑定到嵌套的 ObservableObjects


您的第二种方法是正确的,并且适用于大多数情况:

struct PurchaseView: View {
    @ObservedObject var purchaseViewModel: PurchaseViewModel
    @ObservedObject var itemViewModel: ItemViewModel
    @ObservedObject var clientViewModel: ClientViewModel
    ...
}

如果您为多个视图共享一个ObservableObject ,则可以将其注入环境并作为@EnvironmentObject访问。


或者,您可以将嵌套的 ObservableObjects 设置为structs

class PurchaseViewModel: ObservableObject {
    @Published var clientViewModel: ClientViewModel // <- add `@Published`
    ...
}
struct ClientViewModel { // <- use `struct` instead of `class`
    ...
}

请注意,您的ClientViewModel将在每次它(或其任何属性)更改时成为一个新结构 - 此解决方案不应过度使用(尤其是对于复杂的 ViewModel)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM