如果我有一个ObservableObject
在 SwiftUI 中我可以将其称为@ObservedObject
:
class ViewModel: ObservableObject {
@Published var someText = "Hello World!"
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text(viewModel.someText)
}
}
Or as a @StateObject
:
class ViewModel: ObservableObject {
@Published var someText = "Hello World!"
}
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
Text(viewModel.someText)
}
}
但两者之间的实际区别是什么?是否存在一种情况比另一种更好,或者它们是两种完全不同的事物?
@ObservedObject
当视图创建自己的视图时@ObservedObject
每次视图被丢弃和重绘时都会重新创建实例:
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
}
相反,一个@State
变量意志keep重绘视图时的值。
@StateObject
A @StateObject
是一个组合@ObservedObject
and @State
- 的实例ViewModel
即使在视图被丢弃和重绘之后也会被保留和重用:
struct ContentView: View {
@StateObject var viewModel = ViewModel()
}
表现
虽然一个@ObservedObject
如果视图被迫经常重新创建重量级对象,则会影响性能,但当@ObservedObject
并不复杂。
何时使用@ObservedObject
现在可能看起来没有理由使用@ObservedObject
,那么什么时候应该使用它呢?
您应该对您想要的任何可观察属性使用 @StateObject
在使用它的视图中初始化。如果 ObservableObject 实例
是在外部创建的,并传递给使用它的视图,标记您的
带有 @ObservedObject 的属性。
请注意,可能的用例太多,有时可能是desired在视图中重新创建可观察的属性。在这种情况下,最好使用@ObservedObject
.
有用的链接:
- @StateObject 和 @ObservedObject 有什么区别? https://www.donnywals.com/whats-the-difference-between-stateobject-and-observedobject/
- @ObservedObject、@State 和 @EnvironmentObject 有什么区别? https://www.hackingwithswift.com/quick-start/swiftui/whats-the-difference-between-observedobject-state-and-environmentobject
- 什么是 @StateObject 属性包装器? https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-stateobject-property-wrapper
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)