HarmonyOS 5.0.0 或以上:自定义日期选择器组件(支持年月日选择与回调)


📌 场景介绍

日期选择器在日程类、签到类、报名类应用中极为常见,本篇实现一个:

  • 支持选择“年、月、日”

  • 可传入默认日期

  • 选择完成后回调通知外部


🧱 页面结构

/entry/src/main/ets
  ├── common/components/
  │   └── DatePicker.ets        // 自定义日期选择器组件
  ├── pages/
  │   └── DatePickerDemo.ets    // 示例页面

🧩 DatePicker.ets

@Component
export struct DatePicker {
  @Prop defaultYear: number = new Date().getFullYear()
  @Prop defaultMonth: number = new Date().getMonth() + 1
  @Prop defaultDay: number = new Date().getDate()
  @Prop onConfirm: (y: number, m: number, d: number) => void = () => {}

  @State year: number = this.defaultYear
  @State month: number = this.defaultMonth
  @State day: number = this.defaultDay

  private getDaysInMonth(y: number, m: number): number {
    return new Date(y, m, 0).getDate()
  }

  build() {
    Column() {
      Text("请选择日期").fontSize(18).margin(10)

      // 年
      Picker({
        range: Array.from({ length: 30 }, (_, i) => (1995 + i).toString()),
        selected: this.year - 1995,
        onChange: idx => this.year = 1995 + idx
      }).margin(5)

      // 月
      Picker({
        range: Array.from({ length: 12 }, (_, i) => (i + 1).toString()),
        selected: this.month - 1,
        onChange: idx => this.month = idx + 1
      }).margin(5)

      // 日
      Picker({
        range: Array.from({ length: this.getDaysInMonth(this.year, this.month) }, (_, i) => (i + 1).toString()),
        selected: this.day - 1,
        onChange: idx => this.day = idx + 1
      }).margin(5)

      Button("确认").margin(20).onClick(() => {
        this.onConfirm(this.year, this.month, this.day)
      })
    }
    .padding(20)
    .border({ width: 1, color: '#ccc' })
    .borderRadius(10)
  }
}

🧩 DatePickerDemo.ets 示例页面

@Entry
@Component
struct DatePickerDemo {
  @State selected: string = ''

  build() {
    Column() {
      DatePicker({
        defaultYear: 2024,
        defaultMonth: 12,
        defaultDay: 15,
        onConfirm: (y, m, d) => {
          this.selected = `${y}年${m}月${d}日`
        }
      })

      Text("选择结果:").fontSize(18).margin({ top: 20 })
      Text(this.selected).fontSize(20).fontColor('#007DFF')
    }
    .padding(30)
    .height('100%')
  }
}

✅ 效果说明

  • 默认展示年月日选择器

  • 滚动选择任意值

  • 点击“确认”后展示已选日期结果


🔧 拓展建议

  • 添加时间选择(小时、分钟)

  • 添加“今日按钮”、“清除按钮”

  • 封装为弹出式组件(搭配模态弹窗)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值