2026/10/10 6:00:47

swiftui-ui-patterns - performance

swiftui-ui-patterns - performance 性能护栏Performance guardrails意图当 SwiftUI 界面较大、滚动密集、频繁更新或存在不必要重复计算的风险时使用这些规则。核心规则为ForEach和列表内容提供稳定的身份。当集合可能重排或变化时不要使用不稳定的索引作为身份。将开销大的过滤、排序和格式化移出body当它们不是微不足道时预先计算或移入模型/辅助函数。收窄观察范围使只有读取变化状态的视图需要更新。对较大的滚动内容优先使用懒加载容器并且当界面只有部分区域频繁变化时提取子视图。避免为小的状态变化替换整个顶层视图树保持稳定的根视图只变化局部区域或修饰器。示例稳定身份ForEach(items){iteminRow(item:item)}当集合可能改变顺序时优先于基于索引的身份ForEach(Array(items.enumerated()),id:\.offset){_,iteminRow(item:item)}示例将开销大的工作移出 bodystructFeedView:View{letitems:[FeedItem]privatevarsortedItems:[FeedItem]{items.sorted(using:KeyPathComparator(\.createdAt,order:.reverse))}varbody:someView{List(sortedItems){iteminFeedRow(item:item)}}}如果工作比一个小的派生属性更重将它移入更新频率较低的模型、store 或辅助函数中。何时进一步调查长信息流或网格中滚动卡顿搜索或表单验证导致的输入延迟一小块状态变化时触发过宽的视图更新带大量条件或重复格式化工作的大型界面陷阱每次渲染都重新计算重型转换当只有一个字段重要时让许多后代观察一个大对象当List、LazyVStack或LazyHGrid已经能解决问题时构建自定义滚动容器