HarmonyOs应用《日记本》开发第16篇 - 日记列表页面 Index 详解
本篇深入剖析鸿蒙日记应用的核心入口页面——Index 日记列表页的完整实现涵盖页面结构、状态管理、数据加载与交互逻辑。一、页面概述Index 页面是整个日记应用的首页用户打开应用后首先看到的就是日记列表。该页面负责展示所有已创建的日记条目提供新建日记的入口FAB 浮动按钮支持点击进入日记详情支持长按删除日记空列表状态展示二、页面结构设计2.1 整体布局┌─────────────────────────┐ │ 标题栏 (日记) │ ├─────────────────────────┤ │ │ │ 日记列表 (List) │ │ ┌─────────────────┐ │ │ │ 日期 | 天气心情 │ │ │ │ 内容预览... │ │ │ └─────────────────┘ │ │ ┌─────────────────┐ │ │ │ 日期 | 天气心情 │ │ │ │ 内容预览... │ │ │ └─────────────────┘ │ │ │ │ ┌───┐ │ │ │ │ FAB │ │ └───┘ │ └─────────────────────────┘2.2 状态变量定义EntryComponentstruct Index{Statediaries:DiaryInfo[][]StateisLoading:booleanfalseprivatediaryStore:DiaryStoreDiaryStore.getInstance()aboutToAppear(){this.loadDiaries()}}关键点解析State diaries日记数组是页面的核心状态数据变化时自动触发 UI 刷新State isLoading加载状态标志控制加载动画的显示diaryStore通过单例模式获取数据存储实例避免重复创建三、数据加载逻辑3.1 aboutToAppear 生命周期aboutToAppear(){this.loadDiaries()}privateasyncloadDiaries(){this.isLoadingtruetry{this.diariesawaitthis.diaryStore.getAllDiaries()// 按日期降序排序this.diaries.sort((a,b){returnnewDate(b.date).getTime()-newDate(a.date).getTime()})}catch(error){console.error(加载日记失败: error)}finally{this.isLoadingfalse}}执行流程页面即将显示时自动触发aboutToAppear调用loadDiaries()从 Preferences 异步读取数据按日期降序排序最新的日记显示在最前面异常处理确保网络或存储错误不会导致页面崩溃3.2 页面刷新机制当用户从编辑页面返回时需要刷新列表数据onPageShow(){this.loadDiaries()}这确保了新建或编辑日记后列表能及时反映最新数据。四、列表渲染4.1 List 与 ForEachList({space:12}){ForEach(this.diaries,(diary:DiaryInfo,index:number){ListItem(){this.DiaryCard(diary)}.onClick((){this.goToDetail(diary.id)})},(diary:DiaryInfo)diary.id)}.width(100%).layoutWeight(1)ForEach 参数说明参数说明第一个参数数据源数组this.diaries第二个参数子项生成函数接收item和index第三个参数键值生成函数用于 Diff 算法的唯一标识关键提示键值生成函数返回diary.id确保列表项的唯一性在数据更新时能精确匹配并高效更新 DOM。4.2 日记卡片组件BuilderDiaryCard(diary:DiaryInfo){Row({space:12}){// 左侧日期Column(){Text(diary.day).fontSize(28).fontWeight(FontWeight.Bold)Text(diary.monthYear).fontSize(12).fontColor(#999)}.width(60).alignItems(HorizontalAlign.Center)// 右侧内容Column({space:6}){Row({space:8}){Text(diary.weather)Text(diary.mood)}Text(diary.content).fontSize(14).maxLines(2).textOverflow({overflow:TextOverflow.Ellipsis})}.layoutWeight(1).alignItems(HorizontalAlign.Start)}.width(100%).padding(16).backgroundColor(#FFFFFF).borderRadius(12).shadow({radius:4,color:rgba(0,0,0,0.08)})}卡片设计要点左右布局日期信息在左内容预览在右层次分明阴影效果轻微阴影提升卡片立体感圆角设计12px 圆角符合现代 UI 风格文本截断maxLines(2)Ellipsis确保内容过长时优雅截断五、空状态处理当没有日记时展示友好的空状态提示if(this.diaries.length0){Column({space:16}){Image($r(app.media.empty)).width(120).height(120)Text(还没有日记点击 开始记录吧).fontSize(16).fontColor(#999)}.width(100%).height(100%).justifyContent(FlexAlign.Center)}else{// 正常列表展示}空状态设计原则提供视觉引导插图或图标文案友好引导用户操作居中布局视觉平衡六、导航跳转6.1 跳转到详情页privategoToDetail(id:string){router.pushUrl({url:pages/DiaryDetail,params:{id:id}})}6.2 跳转到编辑页privategoToEdit(){router.pushUrl({url:pages/DiaryEdit,params:{mode:create}})}路由参数传递通过params对象传递参数目标页面通过router.getParams()获取支持字符串、数字、对象等多种类型七、浮动按钮 FABButton(){Image($r(app.media.add)).width(28).height(28)}.width(56).height(56).backgroundColor(#007DFF).borderRadius(28).position({right:20,bottom:20}).shadow({radius:8,color:rgba(0,125,255,0.3)}).onClick((){this.goToEdit()})FAB 实现要点使用position绝对定位固定在右下角圆形按钮borderRadius 宽度的一半蓝色阴影增强浮动感醒目的图标引导用户操作八、下拉刷新Refresh({refreshing:$$this.isRefreshing}){List({space:12}){ForEach(this.diaries,(diary:DiaryInfo){ListItem(){this.DiaryCard(diary)}},(diary:DiaryInfo)diary.id)}}.onRefreshing((){this.loadDiaries()})九、性能优化9.1 懒加载对于大量日记数据可以使用LazyForEach替代ForEachLazyForEach(this.diaryDataSource,(diary:DiaryInfo){ListItem(){this.DiaryCard(diary)}},(diary:DiaryInfo)diary.id)9.2 数据分页privateasyncloadDiaries(page:number0,pageSize:number20){constallDiariesawaitthis.diaryStore.getAllDiaries()conststartpage*pageSizeconstendstartpageSizeconstpageDataallDiaries.slice(start,end)if(page0){this.diariespageData}else{this.diariesthis.diaries.concat(pageData)}}十、总结Index 页面作为应用的首页承担了数据展示和导航枢纽的双重职责。其核心设计要点包括声明式 UI通过State驱动界面自动更新Builder 复用日记卡片通过Builder实现代码复用生命周期管理在aboutToAppear和onPageShow中处理数据加载用户体验空状态、加载状态、下拉刷新等细节完善性能考量ForEach 键值、懒加载等优化手段这些模式在鸿蒙 ArkUI 开发中非常通用掌握它们可以快速构建高质量的列表页面。

相关新闻

自动驾驶大模型压缩技术:从原理到车端部署实践

自动驾驶大模型压缩技术:从原理到车端部署实践

1. 自动驾驶大模型压缩上车的必要性自动驾驶技术正在经历从传统模块化架构向端到端大模型的范式转变。BEV(Birds Eye View)感知、占用网络(Occupancy Networks)以及基于Transformer的端到端模型正在成为行业主流方案。然而&#x…

2026/7/27 4:28:07 阅读更多 →
Governed Agent:构建安全可控的LLM智能体架构实战

Governed Agent:构建安全可控的LLM智能体架构实战

如果你正在探索如何将大语言模型(LLM)安全、可控地集成到生产系统中,那么今天介绍的Governed Agent可能正是你需要的解决方案。传统的 LLM Agent 框架往往把决策权完全交给模型,导致输出不可预测、难以审计,甚至在敏感…

2026/7/27 4:27:07 阅读更多 →
AI重构研发协作:猪齿鱼3.0的端到端智能闭环实践

AI重构研发协作:猪齿鱼3.0的端到端智能闭环实践

1. 猪齿鱼3.0:AI重构研发协作新范式研发团队每天要处理大量重复性工作:需求录入、任务拆解、测试用例编写...这些"体力活"不仅消耗宝贵的人力资源,还因人工操作的不确定性带来质量风险。猪齿鱼3.0的突破在于,它用AI技术…

2026/7/27 4:27:07 阅读更多 →

最新新闻

TI AM389x外设接口硬件设计实战:从引脚配置到信号完整性全解析

TI AM389x外设接口硬件设计实战:从引脚配置到信号完整性全解析

1. 项目概述与核心价值在嵌入式硬件开发领域,尤其是面对像TI AM389x这类集成了丰富外设的高性能处理器时,最让工程师头疼的往往不是核心算法的实现,而是如何正确、高效地将这些强大的外设“接”出来。我见过太多项目,核心板跑得飞…

2026/7/27 4:39:12 阅读更多 →
Java Servlet核心技术解析与性能优化实践

Java Servlet核心技术解析与性能优化实践

1. Java Servlet 技术全景解析Servlet作为Java EE的核心组件,已经发展了二十余年,至今仍是企业级Web开发的基石技术。我在实际项目中使用Servlet已有八年时间,从早期的Tomcat 5.5到现在的Jakarta EE 10,见证了Servlet规范的多次演…

2026/7/27 4:39:12 阅读更多 →
线上系统故障排查:从原理到实践的完整指南

线上系统故障排查:从原理到实践的完整指南

1. 线上故障排查的本质与价值 系统故障就像人体疾病一样,需要精准的诊断和及时的治疗。作为一名从业十年的系统运维工程师,我处理过上千起线上故障,深刻体会到故障排查不仅是一门技术,更是一种思维方式。当系统出现异常时&#xf…

2026/7/27 4:39:12 阅读更多 →
Kerberos认证漏洞实战:AS-REP Roasting攻击原理与Rubeus工具防御指南

Kerberos认证漏洞实战:AS-REP Roasting攻击原理与Rubeus工具防御指南

1. 项目概述:Kerberos认证与AS-REP Roasting漏洞的本质在域渗透测试或红队评估中,Kerberos协议的安全性一直是攻防双方关注的焦点。它作为Windows Active Directory域环境默认的身份验证协议,其复杂性既带来了安全性,也潜藏着诸多…

2026/7/27 4:39:12 阅读更多 →
Cobalt Strike 4.5攻击链全解析:从钓鱼邮件到内网横向移动的攻防实战

Cobalt Strike 4.5攻击链全解析:从钓鱼邮件到内网横向移动的攻防实战

1. 项目概述:一次完整的渗透测试演练 最近在内部安全演练中,我完整复现并分析了一条基于Cobalt Strike 4.5的经典攻击链。这个项目不是教你如何攻击,而是作为一个防御者和安全研究者,我们必须深入理解攻击者的完整作业流程&#x…

2026/7/27 4:39:12 阅读更多 →
Transformer在深度强化学习中的革命性应用

Transformer在深度强化学习中的革命性应用

1. 项目概述Transformer架构在自然语言处理领域大获成功后,正在深度强化学习(Deep Reinforcement Learning, DRL)领域掀起一场革命。这场技术融合正在重塑序列决策问题的解决范式,为机器人控制、游戏AI、自动驾驶等复杂决策场景带…

2026/7/27 4:38:12 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻