SwftUI中的属性包装器(绑定属性)

@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)
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容