# Sélecteur de date
Sélecteur de date. Cinq modes : date / month / year / datetime / range : exploration progressive au sein du panneau (date → mois → année), datetime ajoute des colonnes horaires sous le calendrier (heures/minutes/secondes, roulette ou clics, fusion avec la date lors de la validation), range offre une sélection en deux étapes (le premier clic définit le point de départ et le met en surbrillance, le second clic normalise l'intervalle puis surligne les jours intermédiaires) ; le panneau est monté dans le body et format contrôle le format d'affichage.
<template>
<div class="demo-col" style="gap: 16px">
<div class="demo-row" style="gap: 12px; flex-wrap: wrap">
<LhDatePicker v-model="date" placeholder="Choisir une date" format="dd/MM/yyyy" clearable />
<LhDatePicker v-model="month" mode="month" placeholder="Choisir un mois" size="small" />
<LhDatePicker v-model="year" mode="year" placeholder="Choisir une année" size="large" />
<LhDatePicker v-model="datetime" mode="datetime" placeholder="Choisir une date et une heure" disabled />
<LhDatePicker v-model="date" placeholder="Lecture seule" readonly />
</div>
<LhDatePicker
v-model="range"
mode="range"
range-separator="au"
placeholder="Choisir une plage de dates (deux clics)"
:cell-class-name="cellClass"
popper-class="demo-popper"
/>
<p class="demo-note">
Date : {{ fmt(date) }} | Mois : {{ fmt(month) }} | Année : {{ fmt(year) }} | Date et heure : {{ fmt(datetime) }}
</p>
<p class="demo-note">Plage de dates (rangeSeparator="au", week-end en rouge) : {{ 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('fr-FR', { hour12: false }) : '(non sélectionné)'
},
fmtRange(v) {
if (!Array.isArray(v) || v.length !== 2) return '(non sélectionné)'
const [a, b] = v
const s = (d) => (d instanceof Date ? d.toLocaleString('fr-FR', { hour12: false }) : '(non sélectionné)')
return `${s(a)} ~ ${s(b)}`
},
cellClass(date) {
return date.getDay() === 0 || date.getDay() === 6 ? 'demo-cell-weekend' : ''
},
},
}
</script>
# Props
| Prop | Description | Type | Valeur par défaut |
|---|---|---|---|
| v-model | Sélection courante | Date \| [Date, Date] \| null | — |
| mode | Mode : date / mois / année / date et heure / plage de dates | 'date' \| 'month' \| 'year' \| 'datetime' \| 'range' | 'date' |
| size | Taille | 'small' \| 'medium' \| 'large' | 'medium' |
| disabled / clearable / readonly | Désactivé / effaçable / lecture seule | boolean | false / true / true |
| placeholder | Texte de substitution | string | Pack de langue |
| format | Format d'affichage (yyyy-MM-dd, yyyy-MM, etc.) | string | 'yyyy-MM-dd' |
| rangeSeparator | Texte du séparateur en mode plage de dates | string | '~' |
| cellClassName | Classe personnalisée des cellules | (date: Date) => string | — |
| popperClass | Classe additionnelle de la couche flottante | string | — |
| teleportTarget | Cible de montage de la couche flottante | string \| HTMLElement | 'body' |
| sx | Raccourci de mise en page sx | — | — |
# Events
input (v-model), change (value)
# Accessibilité
Le déclencheur est role="combobox" + aria-expanded, le panneau role="grid" ; en mode datetime, les colonnes horaires utilisent role="spinbutton" avec aria-valuenow/min/max ; placé dans un LhFormItem, aria-invalid est automatiquement posé en cas d'échec de validation.
Copyright © 2024-2026 FengMo WenXue