@State,@StateObject,@ObserverdObject,@EnvironmentObject
當(dāng)被觀察屬性變化時(shí),都會(huì)觸發(fā)視圖刷新
1.@State:
用于管理視圖內(nèi)部的值類型數(shù)據(jù):
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狀態(tài)對象,它負(fù)責(zé)創(chuàng)建和持有一個(gè)ObservableObject實(shí)例,ObservableObject類的屬性用@Published聲明該屬性可被觀察,沒有@Published包裝的屬性變化會(huì)被忽視
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實(shí)例,比如父視圖傳遞給子視圖的ObservableObject參數(shù)。它不會(huì)創(chuàng)建或持有對象。同樣ObservableObject類的聲明中,需要被觀察的屬性需要用@Published包裝。
4.@EnvironmentObject
用于在視圖層次結(jié)構(gòu)中共享對象,被標(biāo)記的@EnvironmentObject對象可以在整個(gè)視圖層次結(jié)構(gòu)中注入和訪問,而無需顯示地傳遞它。同樣ObservableObject類的聲明中,需要被觀察的屬性需要用@Published包裝。
必須在視圖層次結(jié)構(gòu)的根視圖中,使用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)
}
}