HarmonyOs应用《日记本》开发第17篇 - 日记编辑页面 DiaryEdit 详解
本篇详细分析日记编辑页面的实现包括表单输入、日期选择、天气心情标签选择以及数据保存逻辑。一、页面功能概述DiaryEdit 页面是日记应用的核心交互页面承担了新建和编辑两种模式新建模式初始化空表单保存时创建新日记编辑模式加载已有日记数据保存时更新内容日期选择通过 DatePicker 选择日记日期天气/心情标签从预设选项中选择内容输入多行文本输入区域二、页面状态设计2.1 状态变量EntryComponentstruct DiaryEdit{Statediary:DiaryInfonewDiaryInfo()StateisEditMode:booleanfalseStateselectedDate:DatenewDate()StateshowDatePicker:booleanfalseStateshowDeleteConfirm:booleanfalseStatecontentInput:stringStateselectedWeather:WeatherWeather.SUNNYStateselectedMood:MoodMood.HAPPYprivatestore:DiaryStoreDiaryStore.getInstance()privateeditId:string}状态变量说明变量类型用途diaryDiaryInfo当前编辑的日记对象isEditModeboolean区分新建/编辑模式selectedDateDate选中的日期showDatePickerboolean控制日期选择器显示contentInputstring绑定文本输入框内容selectedWeatherWeather当前选中的天气selectedMoodMood当前选中的心情2.2 模式判断aboutToAppear(){constparamsrouter.getParams()asRecordstring,stringif(paramsparams.modeeditparams.id){this.isEditModetruethis.editIdparams.idthis.loadDiary(params.id)}else{this.isEditModefalsethis.diary.datethis.formatDate(newDate())this.selectedDatenewDate()}}逻辑分析从路由参数获取mode和id若mode edit进入编辑模式加载已有数据否则进入新建模式设置默认日期为今天三、页面布局结构3.1 整体布局┌──────────────────────────────┐ │ ← 返回 保存 │ 顶部导航栏 ├──────────────────────────────┤ │ 2026-07-24 ▼ │ 日期选择行 ├──────────────────────────────┤ │ 天气: ☀️ ☁️ ️ ⛅ ️ │ 天气标签 ├──────────────────────────────┤ │ 心情: │ 心情标签 ├──────────────────────────────┤ │ │ │ 今天发生了什么... │ 内容输入区 │ │ │ │ │ │ ├──────────────────────────────┤ │ [删除日记] │ 仅编辑模式显示 └──────────────────────────────┘3.2 顶部导航栏Row(){// 返回按钮Text(返回).fontSize(16).onClick((){router.back()})// 标题Text(this.isEditMode?编辑日记:新建日记).fontSize(18).fontWeight(FontWeight.Bold).layoutWeight(1).textAlign(TextAlign.Center)// 保存按钮Text(保存).fontSize(16).fontColor(#007DFF).onClick((){this.saveDiary()})}.width(100%).height(56).padding({left:16,right:16})四、日期选择功能4.1 日期显示行Row(){Image($r(app.media.calendar)).width(20).height(20)Text(this.formatDate(this.selectedDate)).fontSize(16).layoutWeight(1)Image($r(app.media.arrow_down)).width(16).height(16)}.padding(16).onClick((){this.showDatePickertrue})4.2 DatePicker 弹窗if(this.showDatePicker){DatePickerDialog.show({start:newDate(2020-01-01),end:newDate(),selected:this.selectedDate,onAccept:(value:DatePickerResult){this.selectedDatenewDate(value.year,value.month,value.day)this.diary.datethis.formatDate(this.selectedDate)this.showDatePickerfalse},onCancel:(){this.showDatePickerfalse}})}DatePickerDialog 参数说明参数说明start可选最早日期end可选最晚日期selected默认选中日期onAccept确认选择回调onCancel取消选择回调4.3 日期格式化privateformatDate(date:Date):string{constyeardate.getFullYear()constmonth(date.getMonth()1).toString().padStart(2,0)constdaydate.getDate().toString().padStart(2,0)return${year}-${month}-${day}}格式化要点月份需要 1getMonth()返回 0-11使用padStart(2, 0)保证两位数格式最终输出YYYY-MM-DD格式五、天气与心情选择5.1 天气标签组Text(天气).fontSize(14).fontColor(#666).margin({top:16,left:16})Flex({wrap:FlexWrap.Wrap}){ForEach(WeatherList,(item:WeatherItem,index:number){Text(item.label).fontSize(16).padding({left:16,right:16,top:8,bottom:8}).margin(4).borderRadius(20).backgroundColor(this.selectedWeatheritem.value?#007DFF:#F5F5F5).fontColor(this.selectedWeatheritem.value?#FFFFFF:#333333).onClick((){this.selectedWeatheritem.valuethis.diary.weatheritem.label})})}.padding({left:12,right:12})5.2 心情标签组Text(心情).fontSize(14).fontColor(#666).margin({top:16,left:16})Flex({wrap:FlexWrap.Wrap}){ForEach(MoodList,(item:MoodItem,index:number){Text(item.label).fontSize(16).padding({left:16,right:16,top:8,bottom:8}).margin(4).borderRadius(20).backgroundColor(this.selectedMooditem.value?#007DFF:#F5F5F5).fontColor(this.selectedMooditem.value?#FFFFFF:#333333).onClick((){this.selectedMooditem.valuethis.diary.mooditem.label})})}标签选择设计模式使用Flex组件实现自动换行布局选中状态通过背景色和文字颜色区分圆角胶囊形状符合现代标签设计风格点击即选中支持切换六、内容输入区TextArea({text:this.contentInput,placeholder:今天发生了什么...}).width(100%).height(200).fontSize(16).padding(16).borderRadius(12).backgroundColor(#FAFAFA).onChange((value:string){this.contentInputvaluethis.diary.contentvalue})TextArea 关键属性属性说明text输入框当前文本placeholder占位提示文字onChange文本变化回调height输入区域高度七、数据保存逻辑7.1 表单验证privatevalidateInput():boolean{if(this.contentInput.trim().length0){promptAction.showToast({message:请输入日记内容,duration:2000})returnfalse}returntrue}7.2 保存方法privateasyncsaveDiary(){if(!this.validateInput()){return}// 组装日记数据this.diary.contentthis.contentInputthis.diary.datethis.formatDate(this.selectedDate)try{if(this.isEditMode){this.diary.idthis.editIdawaitthis.store.updateDiary(this.diary)promptAction.showToast({message:保存成功,duration:1500})}else{this.diary.idthis.generateId()this.diary.createTimeDate.now()awaitthis.store.addDiary(this.diary)promptAction.showToast({message:创建成功,duration:1500})}router.back()}catch(error){promptAction.showToast({message:保存失败请重试,duration:2000})console.error(保存日记失败: error)}}保存流程用户点击保存 │ ▼ 表单验证 ──失败──→ 显示错误提示 │ 通过 │ ▼ 判断模式 │ ├──新建──→ 生成ID → 添加日记 → Toast提示 → 返回 │ └──编辑──→ 设置ID → 更新日记 → Toast提示 → 返回7.3 ID 生成privategenerateId():string{returnDate.now().toString()Math.random().toString(36).substr(2,9)}ID 生成策略时间戳保证全局递增性随机字符串防止同一毫秒创建的日记冲突最终格式示例1721845678901a3b7c2d八、删除功能仅在编辑模式下显示删除按钮if(this.isEditMode){Button(删除日记).width(90%).height(48).fontSize(16).fontColor(#FF3B30).backgroundColor(#FFFFFF).borderRadius(12).margin({top:24}).onClick((){this.showDeleteConfirmtrue})}删除确认弹窗将在后续章节详细讨论。九、加载已有数据privateasyncloadDiary(id:string){try{constdiaryawaitthis.store.getDiaryById(id)if(diary){this.diarydiarythis.contentInputdiary.contentthis.selectedDatethis.parseDate(diary.date)this.selectedWeatherthis.getWeatherByLabel(diary.weather)this.selectedMoodthis.getMoodByLabel(diary.mood)}}catch(error){console.error(加载日记失败: error)promptAction.showToast({message:加载失败,duration:2000})}}十、总结DiaryEdit 页面的设计要点双模式复用新建和编辑共用同一页面通过状态变量区分表单数据绑定State变量与 UI 组件双向同步标签选择器Flex 条件样式实现标签组异步保存async/await 处理 Preferences 存储用户反馈Toast 提示操作结果数据验证前端验证防止空内容提交这些模式是鸿蒙表单页面的典型实现适用于各类编辑场景。

相关新闻

AI时代的人类认知革命与协作策略

AI时代的人类认知革命与协作策略

1. 当AI成为日常:我们正在经历的认知革命上周团队里一位资深设计师提交的方案让我愣了三分钟——那些精准的用户动线分析、恰到好处的色彩搭配,居然全出自AI工具。这让我突然意识到,我们早已身处一个连专业壁垒都在消融的时代。当AI开始承担从…

2026/7/27 4:28:08 阅读更多 →
HarmonyOs应用《日记本》开发第16篇 - 日记列表页面 Index 详解

HarmonyOs应用《日记本》开发第16篇 - 日记列表页面 Index 详解

本篇深入剖析鸿蒙日记应用的核心入口页面——Index 日记列表页的完整实现,涵盖页面结构、状态管理、数据加载与交互逻辑。一、页面概述 Index 页面是整个日记应用的首页,用户打开应用后首先看到的就是日记列表。该页面负责: 展示所有已创建的…

2026/7/27 4:28:08 阅读更多 →
自动驾驶大模型压缩技术:从原理到车端部署实践

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

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

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

最新新闻

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

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

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

2026/7/27 4:38:12 阅读更多 →
Transformer架构核心原理与实践优化指南

Transformer架构核心原理与实践优化指南

1. Transformer架构核心原理解析 Transformer模型自2017年由Google团队提出以来,已经成为自然语言处理领域的基石架构。这个看似复杂的系统实际上建立在一系列精妙设计的模块之上,我们不妨将其想象成一个高效的多语言翻译团队:每个成员&#…

2026/7/27 4:38:12 阅读更多 →
命令行智能助手:自然语言交互提升运维效率

命令行智能助手:自然语言交互提升运维效率

1. 项目概述:当命令行遇上自然语言在运维和开发领域,命令行工具是日常排障的利器。但面对复杂的参数组合和晦涩的命令语法,即便是经验丰富的工程师也难免需要频繁查阅手册。catpaw chat的出现,为这个痛点提供了全新的解决方案——…

2026/7/27 4:38:12 阅读更多 →
Pixel-to-Space技术:智能仓储的视觉革命

Pixel-to-Space技术:智能仓储的视觉革命

1. 项目概述:当像素遇见空间——仓储智能化的新范式在物流行业摸爬滚打十年,我见过太多仓库还在用纸质标签和人工记忆管理货架。直到去年参与某3C电子仓改造项目,第一次接触Pixel-to-Space技术体系时,才真正理解什么叫"用图像…

2026/7/27 4:38:12 阅读更多 →
TMS320C55x DSP时钟与内存接口时序设计实战指南

TMS320C55x DSP时钟与内存接口时序设计实战指南

1. 项目概述与核心价值在嵌入式硬件开发,尤其是基于德州仪器(TI)TMS320C55x系列DSP的设计中,时钟与内存接口的时序设计是决定系统能否稳定运行在标称最高频率下的基石。很多工程师在初次接触这类高速数字系统时,往往会…

2026/7/27 4:38:12 阅读更多 →
C++高性能线程池优化:任务队列设计与调度策略深度解析

C++高性能线程池优化:任务队列设计与调度策略深度解析

1. 项目概述:为什么我们需要一个“聪明”的线程池?在C高性能服务端开发里,线程池几乎是每个项目的标配。它就像餐厅的后厨,任务就是一道道待烹饪的菜肴,线程就是厨师。一个朴素的线程池,可能就是一个简单的…

2026/7/27 4:37: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 阅读更多 →

月新闻