SwiftUI 将数据传递给子视图

geo*_*eok 1 swift swiftui

所以我已经阅读了很多关于 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)

当我按下按钮时它没有更新。

paw*_*222 5

var subName: 字符串

struct SubView: View {
    var subName: String
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,你并没有真正的状态。当subName父视图中的属性发生变化时,整个视图SubView都会重新绘制,从而为该subName属性提供一个新值。它基本上是一个常量(尝试将其更改为let,您将获得相同的结果)。

@State var subName: 字符串

struct SubView: View {
    @State var subName: String
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里,您确实有一个@State属性被初始化一次(第一次SubView创建)并且即使在重绘视图时也保持不变。每当你改变subName在父视图中变量时,在子视图中它都会保持不变(它可以从子视图中修改,但不会更改父视图的变量)。

@Binding var subName: 字符串

struct SubView: View {
    @Binding var subName: String
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果你有一个@Binding属性,你可以直接访问父@State变量。每当它在父级中发生变化时,它就会在 SubView 中发生变化(反之亦然)——这就是它被称为binding的原因。