ข้ามไปเนื้อหา
WhereUI

ค้นหาในเอกสาร

ค้นหาชื่อ component หรือหน้าเอกสาร

TimePicker

WhereUI

ช่องเลือกเวลาแบบ 24 ชั่วโมง แยกชั่วโมง/นาทีเป็นรายการเลือก ตั้งระยะห่างนาทีได้ บนมือถือได้เครื่องมือเลือกเวลาของระบบ

ยังไม่ได้ระบุเวลาเข้างาน

ติดตั้ง

Terminal
pnpm dlx shadcn@latest add @whereui/time-picker

ต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก

การใช้งาน

import { TimePicker } from "@/components/ui/time-picker"const [time, setTime] = React.useState("")<TimePicker value={time} onChange={setTime} />

ตัวอย่างเพิ่มเติม

ขั้นนาที 15 นาทีและสถานะปิดใช้งาน
ประชุมเลือกได้ทุก 15 นาที
ปิดใช้งาน

Props

proptypeค่าเริ่มต้นคำอธิบาย
valuestring—เวลาในรูปแบบ "HH:mm" แบบ 24 ชม. ("" = ยังไม่เลือก)
onChange(time: string) => void—ส่งค่า "HH:mm" กลับ — เลือกชั่วโมงอย่างเดียวจะได้นาที 00 อัตโนมัติ
minuteStepnumber1ระยะห่างของตัวเลือกนาที เช่น 5 จะได้ 00, 05, 10, ...
disabledboolean—ปิดการใช้งานทั้งช่อง

ข้อควรรู้

  • ช่องนาทีจะเปิดใช้งานหลังเลือกชั่วโมงแล้วเท่านั้น
  • ใช้ select ดั้งเดิม จึงใช้งานได้ด้วยคีย์บอร์ดและ screen reader โดยไม่ต้องตั้งค่าเพิ่ม

ซอร์สโค้ด

components/ui/time-picker.tsx
"use client"import * as React from "react"import { cn } from "cn"import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"/** เติมเลขให้ครบสองหลัก เช่น 9 -> "09" */function pad2(n: number) {  return String(n).padStart(2, "0")}function TimePicker({  value,  onChange,  minuteStep = 1,  disabled,  className,  ...props}: Omit<React.ComponentProps<"div">, "value" | "onChange"> & {  /** ค่าเวลา "HH:mm" แบบ 24 ชม. ("" = ยังไม่เลือก) */  value?: string  onChange?: (time: string) => void  disabled?: boolean  /** ระยะห่างของตัวเลือกนาที เช่น 5 จะได้ 00, 05, 10, ... */  minuteStep?: number}) {  const [hour, minute] = (value ?? "").split(":")  const step = Math.max(1, Math.round(minuteStep))  const minutes = React.useMemo(    () => Array.from({ length: Math.ceil(60 / step) }, (_, i) => i * step),    [step]  )  const setHour = (h: string) => {    // ยังไม่มีนาที -> ตั้งเป็น 00 ให้เลย เพื่อส่งค่า "HH:mm" ที่ครบ    onChange?.(h ? `${h}:${minute || "00"}` : "")  }  const setMinute = (m: string) => {    if (hour && m) onChange?.(`${hour}:${m}`)  }  return (    <div      data-slot="time-picker"      className={cn("flex w-full min-w-0 items-center gap-1", className)}      {...props}    >      <NativeSelect        aria-label="ชั่วโมง"        disabled={disabled}        value={hour}        onChange={(e) => setHour(e.target.value)}        className="min-w-0 flex-1"      >        <option value="">ชั่วโมง</option>        {Array.from({ length: 24 }, (_, i) => pad2(i)).map((h) => (          <NativeSelectOption key={h} value={h}>            {h}          </NativeSelectOption>        ))}      </NativeSelect>      <span aria-hidden="true" className="text-muted-foreground select-none">        :      </span>      <NativeSelect        aria-label="นาที"        disabled={disabled || !hour}        value={minute}        onChange={(e) => setMinute(e.target.value)}        className="min-w-0 flex-1"      >        <option value="">นาที</option>        {minutes.map((m) => (          <NativeSelectOption key={m} value={pad2(m)}>            {pad2(m)}          </NativeSelectOption>        ))}      </NativeSelect>    </div>  )}export { TimePicker }