# DatePicker 날짜 선택기
날짜 선택기입니다. date / month / year / datetime / range 다섯 가지 모드: 패널 안에서 단계적으로 드릴다운 (날짜 → 월 → 연도) 할 수 있고, datetime은 캘린더 아래에 시간 열 (시/분/초, 롤러 또는 클릭 전환, 확인 시 날짜와 병합) 을 붙이며, range는 두 단계 선택 (첫 클릭으로 시작 날짜를 정하고 하이라이트, 두 번째 클릭으로 구간을 정규화한 뒤 사이 날짜를 하이라이트) 입니다. 패널은 body에 마운트되며, format이 표시 형식을 제어합니다.
날짜 선택
<template>
<div class="demo-col" style="gap: 16px">
<div class="demo-row" style="gap: 12px; flex-wrap: wrap">
<LhDatePicker v-model="date" placeholder="날짜 선택" format="yyyy년 MM월 dd일" clearable />
<LhDatePicker v-model="month" mode="month" placeholder="월 선택" size="small" />
<LhDatePicker v-model="year" mode="year" placeholder="연도 선택" size="large" />
<LhDatePicker v-model="datetime" mode="datetime" placeholder="날짜 및 시간 선택" disabled />
<LhDatePicker v-model="date" placeholder="읽기 전용" readonly />
</div>
<LhDatePicker
v-model="range"
mode="range"
range-separator="까지"
placeholder="날짜 구간 선택 (두 번 클릭)"
:cell-class-name="cellClass"
popper-class="demo-popper"
/>
<p class="demo-note">
날짜: {{ fmt(date) }} | 월: {{ fmt(month) }} | 연도: {{ fmt(year) }} | 날짜 및 시간: {{ fmt(datetime) }}
</p>
<p class="demo-note">날짜 구간 (rangeSeparator="까지", 주말 빨강): {{ fmtRange(range) }}</p>
</div>
</template>
<script>
export default {
data: () => ({
date: new Date(2026, 9, 3),
month: new Date(2026, 9, 1),
year: new Date(2026, 0, 1),
datetime: null,
range: null,
}),
methods: {
fmt(v) {
return v instanceof Date ? v.toLocaleString('zh-CN', { hour12: false }) : '(선택 안 함)'
},
fmtRange(v) {
if (!Array.isArray(v) || v.length !== 2) return '(선택 안 함)'
const [a, b] = v
const s = (d) => (d instanceof Date ? d.toLocaleString('zh-CN', { hour12: false }) : '(선택 안 함)')
return `${s(a)} ~ ${s(b)}`
},
cellClass(date) {
return date.getDay() === 0 || date.getDay() === 6 ? 'demo-cell-weekend' : ''
},
},
}
</script>
# Props
| 프로퍼티 | 설명 | 타입 | 기본값 |
|---|---|---|---|
| v-model | 현재 선택값 | Date \| [Date, Date] \| null | — |
| mode | 모드: 날짜 / 월 / 연도 / 날짜 및 시간 / 날짜 구간 | 'date' \| 'month' \| 'year' \| 'datetime' \| 'range' | 'date' |
| size | 크기 | 'small' \| 'medium' \| 'large' | 'medium' |
| disabled / clearable / readonly | 비활성화 / 지우기 가능 / 읽기 전용 | boolean | false / true / true |
| placeholder | 자리표시 텍스트 | string | 언어 팩 |
| format | 표시 형식 (yyyy-MM-dd, yyyy-MM 등) | string | 'yyyy-MM-dd' |
| rangeSeparator | 날짜 구간 모드의 구분 기호 텍스트 | string | '~' |
| cellClassName | 사용자 정의 셀 클래스명 | (date: Date) => string | — |
| popperClass | 팝업 레이어 추가 클래스명 | string | — |
| teleportTarget | 팝업 레이어 마운트 대상 | string \| HTMLElement | 'body' |
| sx | sx 레이아웃 단축 프로퍼티 | — | — |
# Events
input(v-model), change (value)
# 접근성
트리거는 role="combobox" + aria-expanded, 패널은 role="grid"이며,
datetime 모드의 시간 열은 role="spinbutton"으로 aria-valuenow/min/max를 지정합니다. LhFormItem 안에서 검증 실패 시 자동으로 aria-invalid가 적용됩니다.
Copyright © 2024-2026 FengMo WenXue