@State,@StateObject,@ObserverdObject,@EnvironmentObject
当被观察属性变化时,都会触发视图刷新
1.@State:
用于管理视图内部的值类型数据:
struct CounterView : view{
@state private var count = 0
var body :some View{
VStack{
Text("Count:\(count)")
Button(action:{
count += 1
}){
Text("count++")
}
}
}
}
2.@StateObject
用于管理本视图的ObservableObject状态对象,它负责创建和持有一个ObservableObject实例,ObservableObject类的属性用@Published声明该属性可被观察,没有@Published包装的属性变化会被忽视
class CounterModel : ObservableObject{
@Published var count = 0
}
struct CounterView : View{
@StateObject private variable counter = CounterModel()
var body : some View{
VStack{
Text("Count:\(count)")
Button(action:{
counter.count += 1
}){
Text("count++")
}
}
}
3.@ObservableObject
用于引用由其他视图或外部管理的ObservableObject实例,比如父视图传递给子视图的ObservableObject参数。它不会创建或持有对象。同样ObservableObject类的声明中,需要被观察的属性需要用@Published包装。
4.@EnvironmentObject
用于在视图层次结构中共享对象,被标记的@EnvironmentObject对象可以在整个视图层次结构中注入和访问,而无需显示地传递它。同样ObservableObject类的声明中,需要被观察的属性需要用@Published包装。
必须在视图层次结构的根视图中,使用environmentObject()注入对象。
class CounterModel: ObservableObject {
@Published var count = 0
}
struct CounterView: View {
@EnvironmentObject var counter: CounterModel
var body: some View {
VStack {
Text("Count: \(counter.count)")
Button(action: {
counter.count += 1
}) {
Text ("Increment")
}
}
}
}
// 使用示例
struct ContentView: View {
@Stateobject private var counter = CounterModel()
var body: some View {
VStack{
CounterView()
}
.environmentObject(counter)
}
}