HowTo —— SwiftU2.0 LazyVStack LazyHStack
SwiftUI2.0 提供了 LazyVStack 和 LazyHStack,其作用是只有当 View 在可见区域内才进行渲染,这样可以大大大提高 app 执行效率。由于 VStack 或 HStack 导致的效率问题,在 SwiftUI List (3) —— List、Form、VStack 文章中有简单的比较。
健康笔记 - 新生活从记录开始
健康笔记是一款智能的数据管理和分析工具,让您完全掌控自己和全家人的健康信息。作为慢性病患者,肘子深知健康管理的重要与难度。创建健康笔记的初心,就是要为您提供一款轻松高效的健康信息记录与分析工具
推荐
基本用法
struct LazyStack: View {
var body: some View {
ScrollView{
LazyVStack{ //换成 VStack 作比较新数据创建的时机
ForEach(0...1000,id:\.self){ id in
Text(LazyItem(id:id).title)
}
}
}
}
}
struct LazyItem{
let id:Int
let title:String
init(id:Int){
self.id = id
self.title = "id:\(id)"
print("init new object:\(id)")
}
}
使用 Lazy 特性创建不间断的列表显示
import SwiftUI
struct LazyStack: View {
@State var list = (0...40).map{_ in Item(number:Int.random(in: 1000...5000))}
@State var loading = false
var body: some View {
VStack{
Text("count:\(list.count)")
//数据数量,在 LazyVStack 下数据在每次刷新后才会增加,在 VStack 下,数据会一直增加。
ScrollView{
LazyVStack{ //换成 VStack 作比较
ForEach(list,id:\.id){ item in
Text("id:\(item.number)")
.onAppear {
moreItem(id: item.id)
}
}
}
if loading {
ProgressView()
}
}
}
func moreItem(id:UUID){
//如果是最后一个数据则获取新数据
if id == list.last!.id && loading != true {
loading = true
//增加延时,模拟异步数据获取效果
DispatchQueue.main.asyncAfter(deadline: .now() + 1){
//数据模拟,也可获取网络数据
list.append(contentsOf: (0...30)
.map{_ in Item(number:Int.random(in: 1000...5000))})
loading = false
}
}
}
}
struct Item:Identifiable{
let id = UUID()
let number:Int
}
LazyHStack 的用法同 LazyVStack 一样
如果您发现本文对您有所帮助或者享受阅读,请考虑捐赠以支持我的写作。您的贡献将帮助我继续为您创造有价值的内容。
通过 微信、 Patreon、 Buy Me a Coffee 进行捐赠。
欢迎通过 Twitter、 Discord 频道 或下方的留言板与我进行交流。
通过 微信、 Patreon、 Buy Me a Coffee 进行捐赠。
欢迎通过 Twitter、 Discord 频道 或下方的留言板与我进行交流。
本博客文章采用 CC 4.0 协议,转载需注明出处和作者。