所以我读了很多关于swiftUI的内容,我感到困惑。我了解@State
以及它如何更新后台的视图。我不明白的是,鉴于在子视图上var subname
不是{{1}的事实,为什么在此示例中子视图在顶视图/结构中的状态更改时会自动更新}属性。我希望这不会被更新。有人可以启发我吗?
@State
PS。 如果我将子视图更改为
import SwiftUI
struct SwiftUIView: View {
@State private var name = "George"
var body: some View {
VStack{
SubView(subName: name).foregroundColor(.red)
Button(action: {
self.name = "George2"
}) {
Text("Change view name")
}
}
}
}
struct SubView: View {
var subName:String
var body: some View {
Text(subName)
}
}
struct SwiftUIView_Previews: PreviewProvider {
static var previews: some View {
SwiftUIView()
}
}
当我按下按钮时它不会更新。
答案 0 :(得分:2)
struct SubView: View {
var subName: String
// ...
}
在上面的示例中,您实际上没有状态。当父视图中的subName
属性发生更改时,整个SubView
会被重绘,从而为subName
属性提供新的值。它基本上是一个常数(尝试将其更改为let
,您将获得相同的结果)。
struct SubView: View {
@State var subName: String
// ...
}
这里确实有一个@State
属性,该属性被初始化一次(第一次创建SubView
),并且即使重绘视图也保持不变。每当您在父视图中更改subName
变量时,在SubView中它将保持不变(可以在SubView中对其进行修改,但不会更改父变量)。
struct SubView: View {
@Binding var subName: String
// ...
}
如果您拥有@Binding
属性,则可以直接访问父级的@State
变量。只要在父级中更改了它,就在SubView中更改了(以及相反)-这就是为什么它被称为 binding 。
答案 1 :(得分:1)
只要@State
的{{1}}属性发生更改,都会刷新视图,这意味着将重新计算其整个View
。由于body
是SubView
的{{1}}的一部分,因此,body
每次刷新时,都会使用其SwiftUIView
的新值重绘其SwiftUIView
。属性。