我有一个SwiftUI
列表,它有数千个项目。每个项目都是这样的:
class Item: Codable, Identifiable {
var id = UUID()
var prop1 = ""
var prop2 = ""
}
现在我这样做:
List(store.items.indices, id: .self) { index in
DetailView(item: self.$store.items[index])
}.id(UUID())
我迭代indicies
,因为我必须将Binding
传递给DetailView
。
现在DetailView
已经将TextFields
附加到Item
的属性。
当DetailView
更改Item
的属性时,它会导致List
刷新ALL项,这是我不希望的。
此外,当其中一个属性发生更改时,更新主视图仍然很重要,因为在macOS上,即使单击其中一个项目,主视图仍然可见。
我的问题是,如何使从List
传入的Item
发生更改时,只更新该行
我还尝试了一个提到的解决方案,其中我使用了LazyVStack
,它解决了性能问题,但我在NavigationView
中使用List
,而LazyVStack
似乎不支持这一点。
如有任何建议,我们将不胜感激。
从列表中删除.id(UUID())
。
默认情况下,List diffs会更改并仅更新受影响的行。对于非常大的数据集,.id(UUID())
技巧用于在发生变化时强制重新加载整个列表,这可能比尝试区分大数据集更快。听起来你并不需要它,所以不必要地包含它实际上更糟糕。
编辑:我不认为通过索引绑定到数组是问题所在,但这很不寻常,最终可能会让你头疼。
只要不需要List
特定的功能,就可以在ScrollView
中使用LazyVStack
。List
的效率还不如LazyVStack
(苹果漏洞(。
ScrollView {
LazyVStack {
ForEach(store.items.indices) { index in
DetailView(item: self.$store.items[index])
}
}
}