@ObservedObject
不持久化状态
我可以用吗@ObservedObject
创建持久状态?
就其本身而言,你不能。苹果文档有这个要说的@State
:
给定类型的持久值,视图通过它读取和监视该值。
但我发现没有提到坚持@ObservedObject
所以我构建了这个小演示来证实@ObservedObject
不持久状态:
class Bar: ObservableObject {
@Published var value: Int
init(bar: Int) {
self.value = bar
}
}
struct ChildView: View {
let value: Int
@ObservedObject var bar: Bar = Bar(bar: 0)
var body: some View {
VStack(alignment: .trailing) {
Text("param value: \(value)")
Text("@ObservedObject bar: \(bar.value)")
Button("(child) bar.value++") {
self.bar.value += 1
}
}
}
}
struct ContentView: View {
@State var value = 0
var body: some View {
VStack {
Spacer()
Button("(parent) value++") {
self.value += 1
}
ChildView(value: value)
Spacer()
}
}
}
每当您点击value++
按钮,它会导致重新渲染ChildView
因为value
财产发生变化。当视图由于属性更改而重新呈现时,它是@ObservedObject
s 被重置
![screenshot](https://i.stack.imgur.com/3uTtN.gif)
相反,如果添加一个@State
变量为ChildView
您会注意到,当@ObservedObject
已重置。
使用持久状态@ObservedObject
保持状态@ObservedObject
,实例化具体ObservableObject
with @State
在父视图中。因此,要修复前面的示例,请像这样:
struct ChildView: View {
let value: Int
@ObservedObject var bar: Bar // <-- passed in by parent view
var body: some View {
VStack(alignment: .trailing) {
Text("param value: \(value)")
Text("@ObservedObject bar: \(bar.value)")
Button("(child) bar.value++") {
self.bar.value += 1
}
}
}
}
struct ContentView: View {
@State var value = 0
@State var bar = Bar(bar: 0) // <-- The ObservableObject
var body: some View {
VStack {
Spacer()
Button("(parent) value++") {
self.value += 1
}
ChildView(value: value, bar: bar).id(1)
Spacer()
}
}
}
类的定义Bar
与第一个代码示例相比没有变化。现在我们看到即使在value
属性变化:
![screen shot](https://i.stack.imgur.com/O5SBL.gif)