SwiftUI中LazyVStack在Identifiable属性不变时的重渲染逻辑疑问
SwiftUI中LazyVStack的视图复用与重渲染逻辑
首先要明确核心逻辑:Identifiable的id是给ForEach用来识别「哪个数据对应哪个视图实例」的,它决定视图实例是否被复用,而非视图内容是否需要更新。
在你的示例代码里,点击按钮后实际发生的流程是:
- 虽然每个数据项的
id没变化,但@State修饰的data数组被替换成了全新的SomeData实例集合,每个id对应的name字段都已改变。 ForEach对比新旧数据源的id后,会复用相同id对应的视图实例(不会销毁重建)。- 但视图内容依赖的
datum.name已经变更,SwiftUI的状态依赖机制会检测到这个变化,触发视图内容更新,所以你会看到文字从"A"切换为"B"。
如果想验证视图实例确实被复用,可以给Text添加onAppear回调测试:
Text(datum.name) .onAppear { print("视图实例加载:id \(datum.id)") }
点击按钮切换数据集后,控制台不会再次打印日志——这说明视图实例没有被重新创建,只是用新数据更新了内容,完全符合LazyVStack和ForEach的复用逻辑。
简言之:id负责「是否复用视图容器」,而视图内容是否更新,取决于绑定的数据是否变化,二者是独立的逻辑。
内容的提问来源于stack exchange,提问作者esilver
相关产品推荐
相关产品推荐

