SwiftUI:属性包装器@State使用示例

@State 用于在视图内部管理局部状态。当状态值发生变化时,视图会自动重新渲染。通常用于在一个视图中持有简单的、短期的状态。它特别适合存储值类型数据,如字符串、整数、枚举或结构体实例。

  • @State 用于管理视图的私有状态。
  • @State主要用于存储值类型数据(与视图的生命周期一致)。

作用:@State 用于在视图中声明可变的状态属性,并自动更新视图。当使用 @State 标记属性时,在 SwiftUI 内部会被自动转换为一对 setter 和 getter,对这个属性进行赋值的操作将会触发 View 的刷新,它的 body 会被再次调用,底层渲染引擎会找出界面上被改变的部分,根据新的属性值计算出新的 View,并进行刷新。

应用场景

  • 当需要因视图内的数据变化而触发视图更新时。
  • 它常用于简单的 UI 组件状态管理,如开关状态、文本输入等。
  • 如果数据不需要复杂的跨视图共享,使用 @State 可以简化状态管理。

注意事项

  • 尽量仅在视图的内部使用 @State,即使未显式标记为 private,也应当将其视为视图的私有属性。
  • @State 为包装数据同时提供了双向数据绑定管道,可以通过 $ 前缀来访问。
  • @State 不适合用于存储大量数据或复杂数据模型,这种情况下更适合使用 @StateObject 或其他状态管理方案。
  • 在构造方法中赋值时,需通过 _ 下划线访问 @State 的原始值并进行赋值。
@State var name: String
init(text: String) {
    // 给下划线版本赋值,需要用 State 类型本身进行包装
    _name = State(wrappedValue: text)
}
  • @State 变量在视图的构造函数中只能赋值一次,后续的调整需要在视图的 body 内进行。
  • 如果不需要在当前视图或在子视图中(通过 @Binding )修改值,无需使用 @State。
  • @State 是线程的安全,可以在非主线程中进行修改。

示例

在下面的示例中,我们使用 @State 来声明一个可变的计数属性,点击按钮时,计数会增加并更新视图

struct MyView: View {
    @State private var count: Int = 0
    
    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button("Increment") {
                count += 1
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容