SwiftUI将数据传递到子视图

时间:2020-10-05 09:45:12

标签: swift swiftui

所以我读了很多关于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()
    }
}

当我按下按钮时它不会更新。

2 个答案:

答案 0 :(得分:2)

var子名称:字符串

struct SubView: View {
    var subName: String
    // ...
}

在上面的示例中,您实际上没有状态。当父视图中的subName属性发生更改时,整个SubView会被重绘,从而为subName属性提供新的值。它基本上是一个常数(尝试将其更改为let,您将获得相同的结果)。

@State var子名称:字符串

struct SubView: View {
    @State var subName: String
    // ...
}

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

@Binding var子名称:字符串

struct SubView: View {
    @Binding var subName: String
    // ...
}

如果您拥有@Binding属性,则可以直接访问父级的@State变量。只要在父级中更改了它,就在SubView中更改了(以及相反)-这就是为什么它被称为 binding

答案 1 :(得分:1)

只要@State的{​​{1}}属性发生更改,都会刷新视图,这意味着将重新计算其整个View。由于bodySubView的{​​{1}}的一部分,因此,body每次刷新时,都会使用其SwiftUIView的新值重绘其SwiftUIView。属性。