发布时间:2026/7/18 1:42:32
HarmonyOs应用《重要日》开发第17篇 - 日历页多视图切换 本文解析 ImportantDays 项目中的日历页面CalendarPage包括年/月视图切换、日期导航前后月、今天、日期选择器、选中日期的重要日列表展示、以及日历与重要日数据的联动设计。一、页面定位CalendarPage是应用的第二个 Tab 页面提供日历浏览功能。用户可以在年视图和月视图之间切换左右滑动浏览不同月份/年份点击日期查看当天的重要日通过日期选择器快速跳转二、组件定义ComponentV2exportstruct CalendarPage{vm:CalendarVMCalendarVM.getInstance();manager:ImportantDayManagerImportantDayManager.getInstance();LocalcurrentTitle:string;LocalselectedDays:ImportantDay[][];LocalshowDatePicker:booleanfalse;}状态变量变量说明vm日历视图模型单例manager重要日管理器单例currentTitle当前显示的标题年/月selectedDays选中日期的重要日列表showDatePicker日期选择器弹窗状态三、生命周期aboutToAppear():void{this.updateTitle();this.updateSelectedDays();}页面即将出现时初始化标题和选中日期的重要日列表。四、build 方法整体结构build(){Column(){// 1. 标题栏导航 今天按钮Row(){...}// 2. 视图切换按钮Row(){...}// 3. 日历主体if(this.vm.viewTypeViewTypeEnum.YEAR){YearCalendar({...})}else{MonthWeekCalendar({...})}// 4. 选中日期的重要日列表if(this.selectedDays.length0){Divider()Text(当日重要日)Scroll(){Column(){ForEach(this.selectedDays,(day){this.importantDayCard(day)})}}}}.bindSheet($$this.showDatePicker,this.datePickerBuilder(),{...})}布局层次Column ├── Row (标题栏) ├── Row (视图切换) ├── YearCalendar / MonthWeekCalendar (日历主体) └── [条件] 当日重要日列表 ├── Divider ├── Text (标题) └── Scroll → ForEach → importantDayCard五、标题栏与导航Row(){// 上个月按钮Text().fontSize(20).fontColor(#666666).padding(8).onClick((){this.vm.selectDatethis.vm.selectDate.subtract(1,month);this.updateTitle();})// 当前月份标题Text(this.currentTitle).fontSize(20).fontWeight(FontWeight.Bold).fontColor(#333333).layoutWeight(1).textAlign(TextAlign.Center).onClick((){this.showDatePickertrue;})// 下个月按钮Text().fontSize(20).fontColor(#666666).padding(8).onClick((){this.vm.selectDatethis.vm.selectDate.add(1,month);this.updateTitle();})// 今天按钮Text(今天).fontSize(14).fontColor(#FF6B6B).padding({left:8,right:8}).onClick((){this.vm.goToToday();this.updateTitle();this.updateSelectedDays();})}导航功能按钮功能上一月标题打开日期选择器下一月今天跳转到今天标题点击点击标题文字打开日期选择器用户可以快速选择目标日期。六、视图切换Row(){ForEach(this.getViewTypes(),(item:ViewTypeItem){Text(item.name).fontSize(13).fontColor(this.vm.viewTypeitem.type?#FFFFFF:#666666).backgroundColor(this.vm.viewTypeitem.type?#FF6B6B:#F5F5F5).borderRadius(12).padding({left:12,right:12,top:4,bottom:4}).margin({right:8}).onClick((){this.vm.changeViewType(item.type);this.updateTitle();})})}privategetViewTypes():ViewTypeItem[]{return[{type:ViewTypeEnum.YEAR,name:年},{type:ViewTypeEnum.MONTH,name:月}];}视图切换按钮[年] [月]选中状态白字红底未选中灰字灰底切换逻辑点击按钮 →vm.changeViewType(type)→ VM 切换视图并重置数据 →updateTitle()更新标题。七、日历主体渲染if(this.vm.viewTypeViewTypeEnum.YEAR){YearCalendar({vm:this.vm,onSelectDate:(date:Date){this.vm.changeDate(dayjs(date));this.vm.changeViewType(ViewTypeEnum.MONTH);this.updateTitle();this.updateSelectedDays();}})}else{MonthWeekCalendar({vm:this.vm,onChangeDay:(date:Date){this.updateSelectedDays();},selectedColor:#FF6B6B,startWeekday:this.vm.startWeekday,isShowHeader:true})}年视图回调年视图中选择日期后更新 VM 选中日期自动切换到月视图更新标题和重要日列表月视图回调月视图中选择日期后更新选中日期的重要日列表下方区域展示当天重要日八、当日重要日列表if(this.selectedDays.length0){Divider().color(#EEEEEE)Text(当日重要日).fontSize(14).fontWeight(FontWeight.Medium).fontColor(#333333).padding({left:12,top:8,bottom:4})Scroll(){Column(){ForEach(this.selectedDays,(day:ImportantDay){this.importantDayCard(day)})}.padding({left:12,right:12,bottom:12})}.layoutWeight(1)}条件渲染只有选中日期有重要日时才显示此区域避免空列表占用空间。重要日卡片BuilderimportantDayCard(day:ImportantDay){Row(){// 颜色条Column().width(4).height(40).backgroundColor(day.color).borderRadius(2).margin({right:8})Column(){Text(day.title).fontSize(15).fontWeight(FontWeight.Medium).fontColor(#333333).maxLines(1)Text(${DateUtil.getFullDateStr(day.targetDate)}·${day.getDisplayText()}).fontSize(12).fontColor(#999999).margin({top:2})}.layoutWeight(1)// 倒数/正数标签Text(day.isCountdown?倒数:正数).fontSize(10).fontColor(day.isCountdown?#FF6B6B:#4ECDC4).backgroundColor(day.isCountdown?#FFF0F0:#E8FAF8).borderRadius(4).padding({left:6,right:6,top:2,bottom:2})}.padding({top:8,bottom:8}).borderRadius(8).backgroundColor(#FAFAFA).margin({bottom:4})}卡片设计┌─┬───────────────────────────────┬──────┐ │ │ 妈妈生日 │ 倒数 │ │ │ 2026年08月15日 · 还有 29 天 │ │ └─┴───────────────────────────────┴──────┘ 4vp layoutWeight(1) auto比列表页的卡片更简洁细色条4vp 宽代替宽色条无操作按钮添加倒数/正数标签九、日期选择器BuilderdatePickerBuilder(){Column(){Text(选择日期).fontSize(18).fontWeight(FontWeight.Medium).padding(16)DatePicker({start:newDate(2000-01-01),end:newDate(2099-12-31),selected:this.vm.selectDate.toDate()}).onChange((value:DatePickerResult){if(value.yearvalue.month!undefinedvalue.day){constdatedayjs().year(value.year).month(value.month).date(value.day);this.vm.changeDate(date);this.updateTitle();this.updateSelectedDays();}}).width(100%).height(200)Button(确定).width(80%).height(40).backgroundColor(#FF6B6B).margin({top:16}).onClick((){this.showDatePickerfalse;})}}DatePicker 配置配置值说明start2000-01-01可选最早日期end2099-12-31可选最晚日期selected当前选中日期初始显示日期选择流程用户滚动选择年/月/日onChange实时更新 VM 选中日期点击确定关闭弹窗标题和重要日列表自动更新十、更新方法privateupdateTitle():void{if(this.vm.viewTypeViewTypeEnum.YEAR){this.currentTitlethis.vm.getCurrentYearTitle();}else{this.currentTitlethis.vm.getCurrentMonthTitle();}}privateupdateSelectedDays():void{this.selectedDaysthis.vm.getSelectedDateDays();}updateTitle根据当前视图类型生成不同标题年视图2026年月视图2026年07月updateSelectedDays从 VM 获取选中日期的重要日列表更新到selectedDays。十一、数据联动日期选择 → 列表更新用户点击日期 ↓ MonthWeekCalendar.onDateClick ↓ vm.changeDate(date) ↓ onChangeDay 回调 ↓ CalendarPage.updateSelectedDays() ↓ vm.getSelectedDateDays() ↓ ImportantDayManager.getDaysByDate(dateStr) ↓ selectedDays 更新 ↓ UI 自动刷新Local 变化月份切换 → 标题更新用户滑动 Swiper ↓ handleSwiperChange ↓ vm.selectDate 更新到新月份 ↓ CalendarPage 检测到月份变化 ↓ updateTitle() ↓ 标题更新十二、总结CalendarPage的设计体现了以下原则多视图共存年视图和月视图通过条件渲染切换多维度导航前后按钮 今天按钮 日期选择器数据联动日期选择自动更新重要日列表条件渲染无重要日时不显示列表区域卡片差异化日历页卡片比列表页更简洁标题智能切换根据视图类型显示年或月标题日历页为用户提供了从宏观年视图到微观月视图当日重要日的完整日历浏览体验。

相关新闻

2026/7/18 1:42:32

LDO稳压器原理、设计与选型指南

1. LDO基础概念与核心特性低压差线性稳压器(Low Dropout Regulator,简称LDO)是现代电子系统中不可或缺的电源管理器件。作为一名从事电源设计十余年的工程师,我见证了这个领域从传统线性稳压器到高性能LDO的技术演进。LDO最显著的…

2026/7/18 1:42:32

Windows系统隐藏文件夹清理与C盘空间优化指南

1. Windows系统隐藏文件夹的清理指南每次打开资源管理器看到C盘飘红,相信不少Windows用户都会心头一紧。系统盘空间不足不仅会导致运行卡顿,更会影响软件更新和日常使用。其实Windows系统中暗藏了不少"空间杀手",它们往往躲在系统目…

2026/7/18 1:42:32

Windows系统隐藏文件夹清理与优化指南

1. Windows系统隐藏文件夹清理指南每次打开资源管理器看到C盘飘红,作为十年Windows老用户我都忍不住皱眉。那个神秘的"Windows.old"文件夹就像个隐形空间吞噬者,动辄占用几十GB空间,却鲜少有人知道它的存在和清理方法。今天我们就来…

2026/7/18 2:37:35

VLANeXt:12维可解耦VLA架构设计与工程落地实践

1. 为什么VLANeXt的“12维配方”不是又一个炼丹玄学?去年在实验室调OpenVLA时,我连续三周卡在同一个LIBERO-Single任务上:模型在训练集上准确率98%,一到测试集就掉到42%。翻遍论文、GitHub issue、Discord群聊,得到的答…

2026/7/18 2:37:35

深入解析Tiva USB控制器寄存器:从OTG模式到中断管理的实战指南

1. 项目概述与核心价值如果你正在开发基于Tiva™ C系列(如TM4C123GH6ZRB)的USB设备,或者需要深入理解嵌入式USB控制器的底层运作机制,那么这篇文章就是为你准备的。USB接口看似简单,但要让一个微控制器稳定、高效地扮演…

2026/7/18 2:37:35

Cocos Creator触摸事件穿透:原理、解决方案与实战指南

1. 项目概述:触摸事件穿透的困扰与本质在Cocos Creator里做UI交互,尤其是处理多层UI叠加的场景时,很多开发者都踩过同一个坑:明明点击了上层的一个按钮,结果下层背景的按钮也跟着响应了。这种“一石二鸟”的现象&#…

2026/7/18 2:37:35

2022年Python学习路线:从基础到领域专项

1. Python学习路线全景解析(2022版)作为一名从2010年开始接触Python的老程序员,我见证了这门语言从小众到主流的全过程。2022年的Python生态已经发生了翻天覆地的变化,这份学习路线将结合我12年的实战经验,帮你避开那些…

2026/7/18 2:37:35

FPGA实现USB2.0控制器:VHDL协议栈设计与工业应用

1. 项目背景与核心需求USB接口作为现代电子设备的标准配置,其控制器设计一直是嵌入式开发中的关键环节。传统方案多采用专用USB控制器芯片(如FT232、CH340等),但这类方案存在灵活性不足、成本偏高的问题。基于FPGA的USB控制器设计…

2026/7/18 2:32:35

LDO输入端串联电阻的设计原理与工程实践

1. LDO输入端串联电阻的必要性解析在LDO(低压差线性稳压器)电路设计中,输入端串联电阻的做法看似简单却蕴含多重设计考量。这个电阻绝非随意添加,而是针对LDO工作特性进行的必要优化。1.1 抑制输入电压尖峰当LDO输入端直接连接电源…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/17 7:39:19

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/18 0:00:24

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/17 14:59:44

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…