月份切换与年份导航:prevMonth / nextMonth 逻辑

前言

在日历应用中,月份切换是最基本的交互。"海风日记"的日历页通过左右箭头按钮实现月份切换,同时支持"今天"按钮快速回到当月。

本文将从源码出发,深入讲解月份切换的逻辑实现和边界处理。


一、月份切换实现

1.1 状态变量

typescript 复制代码
@Component
export struct CalendarTab {
  @State curYear: number = new Date().getFullYear()
  @State curMonth: number = new Date().getMonth()  // 0-indexed
  private todayDate = new Date().getDate()
  private todayMonth = new Date().getMonth()
  private todayYear = new Date().getFullYear()
}

1.2 上个月

typescript 复制代码
private prevMonth() {
  if (this.curMonth === 0) {
    this.curYear -= 1      // 跨年
    this.curMonth = 11     // 十二月
  } else {
    this.curMonth -= 1
  }
}

1.3 下个月

typescript 复制代码
private nextMonth() {
  if (this.curMonth === 11) {
    this.curYear += 1      // 跨年
    this.curMonth = 0      // 一月
  } else {
    this.curMonth += 1
  }
}

二、导航按钮

typescript 复制代码
Row({ space: 12 }) {
  // 左箭头
  Button() {
    SymbolGlyph($r('sys.symbol.chevron_left')).fontSize(16).fontColor([COLOR_TEXT_MAIN])
  }
  .backgroundColor('transparent').width(36).height(36)
  .onClick(() => { this.prevMonth() })

  // 月份标题
  Column({ space: 2 }) {
    Text(this.getMonthName(this.curMonth))
      .fontSize(22).fontColor(COLOR_TEXT_MAIN).fontWeight(FontWeight.Bold)
    Text(`${this.curYear}年`).fontSize(12).fontColor(COLOR_TEXT_SECONDARY)
  }
  .alignItems(HorizontalAlign.Center)

  // 右箭头
  Button() {
    SymbolGlyph($r('sys.symbol.chevron_right')).fontSize(16).fontColor([COLOR_TEXT_MAIN])
  }
  .backgroundColor('transparent').width(36).height(36)
  .onClick(() => { this.nextMonth() })
}

三、"今天"按钮

typescript 复制代码
Button('今天')
  .height(30).fontSize(13).fontColor('#FFFFFF').fontWeight(FontWeight.Bold)
  .backgroundColor(COLOR_PRIMARY).borderRadius(15)
  .padding({ left: 12, right: 12 })
  .onClick(() => {
    this.curYear = this.todayYear
    this.curMonth = this.todayMonth
  })

四、年视图的年份导航

typescript 复制代码
Row({ space: 4 }) {
  Button() {
    SymbolGlyph($r('sys.symbol.chevron_left')).fontSize(16).fontColor([COLOR_AMBER])
  }
  .backgroundColor('transparent').width(36).height(36)
  .onClick(() => { this.curYear -= 1 })

  Button() {
    SymbolGlyph($r('sys.symbol.chevron_right')).fontSize(16).fontColor([COLOR_AMBER])
  }
  .backgroundColor('transparent').width(36).height(36)
  .onClick(() => { this.curYear += 1 })
}

五、常见问题

5.1 月份切换后 UI 不更新

问题:点击切换按钮后,月份数字没有变化。

原因@State 变量更新了但 UI 未重新渲染。

解决方案 :确保 curYearcurMonth@State 变量。


总结

本文通过"海风日记"的日历页,深入讲解了月份切换的实现:

  1. prevMonth/nextMonth:月份切换逻辑
  2. 跨年处理:边界情况处理
  3. "今天"按钮:快速回到当月
  4. 年视图导航:年份切换

下一篇文章将深入讲解 月统计面板,敬请期待。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

相关推荐
小蒜学长15 分钟前
springboot党建云课堂学习与管理系统(代码+数据库+LW)
java·数据库·spring boot·后端·学习
烂蜻蜓2 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055979 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿10 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909612 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理13 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒13 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构14 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构14 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构14 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端