搜索引擎网站开发安阳到濮阳
2026/6/1 5:21:53 网站建设 项目流程
搜索引擎网站开发,安阳到濮阳,国外注册的域名国内能用吗,一级域名网站在上一篇《HarmonyOS 教学实战#xff08;二#xff09;》中#xff0c;我们已经让应用具备了#xff1a;网络请求本地缓存离线兜底完整 Store 设计但只要你的数据一多#xff0c;列表就一定是性能重灾区。真实项目中#xff0c;80% 的卡顿都来自#xff1a;❌ 列表一次…在上一篇《HarmonyOS 教学实战二》中我们已经让应用具备了网络请求本地缓存离线兜底完整 Store 设计但只要你的数据一多列表就一定是性能重灾区。真实项目中80% 的卡顿都来自❌ 列表一次性加载❌ 下拉刷新逻辑混乱❌ 滚动时频繁重建组件这一篇我们专门解决这些问题。一、这一篇我们要解决哪些真实痛点围绕一个真实列表页面完成 3 件事 列表分页加载上拉加载更多 下拉刷新重新请求第一页 列表性能优化可复用组件 状态收敛完成后你的列表会具备数据多也不卡、刷新快、滚动顺二、先改接口支持分页返回假设后端接口升级为GET /api/tasks?page1pageSize10返回格式{ list: [ { id: 101, title: 学习 HarmonyOS } ], hasMore: true }三、第一步升级网络 Service分页支持修改service/TaskService.etsexport interface PageResultT { list: T[] hasMore: boolean } export class TaskService { static async fetchTasks( page: number, pageSize: number ): PromisePageResultTask { const httpRequest http.createHttp() const response await httpRequest.request( https://example.com/api/tasks?page${page}pageSize${pageSize}, { method: http.RequestMethod.GET } ) const data JSON.parse(response.result as string) return { list: data.list.map(item new Task(item.id, item.title)), hasMore: data.hasMore } } }四、第二步升级 Store分页核心逻辑分页的核心逻辑必须放在 Store而不是 UI。修改model/TaskModel.etsObservedV2 export class TaskStore { tasks: Task[] [] page: number 1 pageSize: number 10 hasMore: boolean true loading: boolean false refreshing: boolean false async refresh() { if (this.refreshing) return this.refreshing true this.page 1 const result await TaskService.fetchTasks(this.page, this.pageSize) this.tasks result.list this.hasMore result.hasMore this.refreshing false } async loadMore() { if (!this.hasMore || this.loading) return this.loading true this.page const result await TaskService.fetchTasks(this.page, this.pageSize) this.tasks this.tasks.concat(result.list) this.hasMore result.hasMore this.loading false } }教学重点refresh()只管第一页loadMore()只管追加UI 只需要调用不参与逻辑判断五、第三步页面中接入下拉刷新 上拉加载修改pages/Index.etsComponentV2 struct Index { Local store new TaskStore() Once async init() { await this.store.refresh() } build() { Column() { Refresh({ refreshing: this.store.refreshing }) { List() { ForEach(this.store.tasks, (item: Task) { TaskItem({ task: item, onDelete: () {} }) }, item item.id.toString()) if (this.store.hasMore) { ListItem() { Text(this.store.loading ? 加载中... : 上拉加载更多) .onAppear(() this.store.loadMore()) } } } } } } }onAppear是分页加载的关键 不需要监听滚动位置 非常稳定六、第四步列表性能优化重点1️⃣ 使用 ReusableV2 优化列表项ReusableV2 ComponentV2 export struct TaskItem { Param task: Task Event onDelete: (id: number) void build() { Row() { Text(this.task.title) Button(删除) .onClick(() this.onDelete(this.task.id)) } } } ArkUI 会自动复用组件结构 滚动时不会频繁销毁/重建2️⃣ 避免 ListItem 中使用 Local 状态❌ 错误示例Local checked false会导致每个 Item 都维护自己的状态极易卡顿。✔ 正确做法状态上移到 Store 或 Model3️⃣ 控制刷新粒度状态收敛避免这样的写法Local store new TaskStore() // 整个 store 变 → 全列表刷新更优方式是列表只依赖tasksloading 状态放在 footer七、第五步缓存 分页怎么配合推荐策略场景行为首次进入读缓存 → 再 refresh下拉刷新丢弃缓存上拉加载不写缓存退出页面保存当前列表 不要每一页都缓存 缓存的是“可用数据”不是“中间态”八、常见分页性能坑必看❌ 坑 1List Column 嵌套会导致全部子项提前创建✔ 用 List ListItem❌ 坑 2key 不稳定key index // 非常危险✔ 使用业务 id❌ 坑 3刷新 加载同时进行✔ Store 中用标志位严格限制九、现在你的 App 已经是“工业级列表”了你已经具备✔ 分页加载✔ 下拉刷新✔ 状态隔离✔ 高性能列表✔ 可扩展 Store 结构这已经是90% 商业 App 列表的实现水平。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询