1

如何在 SwiftUI 中重新初始化视图但未重新计算主体并重新渲染视图?


例子

import SwiftUI

struct ContentView: View {
    var body: some View {
        SubView()
            .padding()
    }
}

struct SubView: View {
    
    @State private var items = [Int]()
    
    init() {
        print("SubView init")
    }
    
    var body: some View {
        Text("\(items.count)")
        Button("Add item") { items.append(Int.random(in: 0..<10)) }
        Divider()
        SubSubView()
        SubSubView()
    }
}

struct SubSubView: View {
    init() {
        print("SubSubView init")
    }
    
    var body: some View {
        Text("I'm a subview") (>> _breakpoint here_)
    }
}

如果我在按钮上点击 4 次,则视图如下:

    在此处输入图像描述

但是我们在控制台中有这个:

SubView init (>> app launch)
SubSubView init (>> app launch)
SubSubView init (>> app launch)
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init
SubSubView init

SubSubViewbody属性不会重新计算(使用断点)。是否仅在视图依赖项发生任何更改时才重新渲染此 SubSubView,即使它再次重新初始化?

4

1 回答 1

0

现在,我不是专家,也没有任何来源,但我可以想象它是这样的:

当您更改items变量时,SwiftUI 必须找出哪些子视图取决于该值,以便可以使用正确(更新)的值重新渲染它们。找出对象是否已更改的一种简单方法是通过hashes。所以,我认为 SwiftUI(内部)重新初始化视图,计算结构的哈希值,如果它与当前视图的哈希值不同,它会被重新渲染。否则,更改 (of items) 不会影响视图,因此不需要重新渲染。

body编辑:为清楚起见,当对象的其余部分是时,计算属性(如)不会被初始化。它是按需计算的。这就是为什么您也可以在其中使用其他变量的原因。

于 2020-11-15T09:27:12.550 回答