所以我已经阅读了很多关于 swiftUI 的内容,但我很困惑。我了解@State以及它如何更新幕后的视图。我无法理解的是为什么当我在这个示例中的子视图在顶部视图/结构中的状态发生变化时自动更新,因为在子视图上 varsubname不是@State属性。我希望这不会被更新。有人可以启发我吗?
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()
}
}
Run Code Online (Sandbox Code Playgroud)
附注。如果我将子视图更改为
struct SubView: View {
@State var subName:String
var body: some View {
Text(subName)
}
}
Run Code Online (Sandbox Code Playgroud)
当我按下按钮时它没有更新。
struct SubView: View {
var subName: String
// ...
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,你并没有真正的状态。当subName父视图中的属性发生变化时,整个视图SubView都会重新绘制,从而为该subName属性提供一个新值。它基本上是一个常量(尝试将其更改为let,您将获得相同的结果)。
struct SubView: View {
@State var subName: String
// ...
}
Run Code Online (Sandbox Code Playgroud)
在这里,您确实有一个@State属性被初始化一次(第一次SubView创建)并且即使在重绘视图时也保持不变。每当你改变subName在父视图中变量时,在子视图中它都会保持不变(它可以从子视图中修改,但不会更改父视图的变量)。
struct SubView: View {
@Binding var subName: String
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果你有一个@Binding属性,你可以直接访问父@State变量。每当它在父级中发生变化时,它就会在 SubView 中发生变化(反之亦然)——这就是它被称为binding的原因。
| 归档时间: |
|
| 查看次数: |
1065 次 |
| 最近记录: |