Skip to content

DatePicker 日期选择器

用于在表单、筛选和业务配置中输入或选择日期,也可以选择月份、年份、季度、周和日期范围。只需要选择一天内具体时间时,请使用 TimePicker 时间选择器

何时使用

  • 用户需要填写生日、截止日期、排期日期、账期等日期字段。
  • 用户需要在筛选表单中选择一个日期范围。
  • 需要限制周末、历史日期或业务不可用日期时。

基础用法

当前日期:2026-06-04
vue
<template>
  <x-date-picker v-model="date" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('2026-06-04');
</script>

受控值和事件

弹层:关闭,等待操作
vue
<template>
  <x-date-picker
    v-model="date"
    v-model:popup-visible="popupVisible"
    allow-clear
    @select="handleSelect"
    @change="handleChange"
    @clear="handleClear"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('2026-06-04');
const popupVisible = ref(false);
const handleSelect = (value: string | undefined) => console.log('select', value);
const handleChange = (value: string | undefined) => console.log('change', value);
const handleClear = () => console.log('clear');
</script>

月份、年份、季度和周

vue
<template>
  <x-month-picker v-model="month" />
  <x-year-picker v-model="year" />
  <x-quarter-picker v-model="quarter" />
  <x-week-picker v-model="week" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const month = ref('2026-06');
const year = ref('2026');
const quarter = ref('2026-Q2');
const week = ref('2026-23rd');
</script>

日期范围

-
范围:2026-06-02 ~ 2026-07-29
vue
<template>
  <x-range-picker v-model="range" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const range = ref(['2026-06-01', '2026-06-30']);
</script>

中国农历展示

-
农历辅助展示不会改变绑定值:2026-02-17,2026-06-19 ~ 2026-09-25
vue
<template>
  <x-date-picker v-model="date" show-lunar />
  <x-range-picker
    v-model="range"
    :show-lunar="{ showSolarFestival: true }"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('2026-02-17');
const range = ref(['2026-06-19', '2026-09-25']);
</script>

带时间的日期选择

-
日期时间:2026-06-04 09:30:00日期时间范围:2026-06-02 00:00:00 ~ 2026-07-29 09:09:06
vue
<template>
  <x-date-picker v-model="dateTime" show-time />
  <x-range-picker v-model="dateTimeRange" show-time />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const dateTime = ref('2026-06-04 09:30:00');
const dateTimeRange = ref(['2026-06-02 00:00:00', '2026-07-29 09:09:06']);
</script>

月范围和受控面板

-
月范围:2026-01 ~ 2026-06,面板:2026-06-01
vue
<template>
  <x-range-picker v-model="monthRange" mode="month" />
  <x-date-picker
    v-model="date"
    v-model:picker-value="panel"
    show-confirm-btn
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const monthRange = ref(['2026-01', '2026-06']);
const date = ref('2026-06-04');
const panel = ref('2026-06-01');
</script>

动态范围限制

-
结束日期限制在开始日期前后 7 天内,等待操作
vue
<template>
  <x-range-picker
    v-model="range"
    :disabled-date="disabledDate"
    @calendar-change="handleCalendarChange"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const range = ref<string[]>([]);
const draft = ref<string[]>([]);

const disabledDate = (current: Date, type?: 'start' | 'end') => {
  if (type !== 'end' || !draft.value[0]) return false;
  const start = new Date(draft.value[0]).getTime();
  const target = current.getTime();
  return Math.abs(target - start) > 7 * 24 * 60 * 60 * 1000;
};

const handleCalendarChange = (value: string[]) => {
  draft.value = value.filter(Boolean);
};
</script>

尺寸

vue
<template>
  <x-date-picker v-model="date" size="mini" />
  <x-date-picker v-model="date" size="small" />
  <x-date-picker v-model="date" size="medium" />
  <x-date-picker v-model="date" size="large" />
</template>

状态

vue
<template>
  <x-date-picker v-model="date" allow-clear />
  <x-date-picker default-value="2026-06-04" readonly />
  <x-date-picker default-value="2026-06-04" disabled />
  <x-date-picker v-model="date" error />
</template>

禁用日期

周末不可选择
vue
<template>
  <x-date-picker v-model="date" :disabled-date="disabledDate" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('2026-06-04');
const disabledDate = (current: Date) => {
  const day = current.getDay();
  return day === 0 || day === 6;
};
</script>

禁止键盘输入

仍可打开面板选择,但不会编辑输入框文本
vue
<template>
  <x-date-picker v-model="date" input-read-only />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('2026-06-04');
</script>

快捷项和值格式

当前值:未选择
vue
<template>
  <x-date-picker
    v-model="date"
    value-format="timestamp"
    :shortcuts="shortcuts"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const date = ref('');
const shortcuts = [
  { label: '今天', value: () => new Date() },
  { label: '本月初', value: '2026-06-01' },
];
</script>

自定义内容

交付
📅
vue
<template>
  <x-date-picker v-model="date">
    <template #prefix>交付</template>
    <template #suffix-icon>📅</template>
    <template #cell="{ label }">
      <strong>{{ label }}</strong>
    </template>
    <template #extra>选择值:{{ date || '未选择' }}</template>
  </x-date-picker>
</template>

表单组合

-
vue
<template>
  <x-form :model="form">
    <x-form-item field="date" label="交付日期" required>
      <x-date-picker v-model="form.date" allow-clear />
    </x-form-item>
    <x-form-item field="range" label="周期">
      <x-range-picker v-model="form.range" />
    </x-form-item>
  </x-form>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

const form = reactive({
  date: '',
  range: ['2026-06-01', '2026-06-30'],
});
</script>

按需导入

ts
import {
  DatePicker,
  MonthPicker,
  YearPicker,
  QuarterPicker,
  WeekPicker,
  RangePicker,
} from 'x-next';

DatePicker Props

参数说明类型默认值
type选择器类型'date' | 'month' | 'year' | 'quarter' | 'week' | 'date-range' | 'month-range' | 'year-range' | 'quarter-range' | 'week-range''date'
modeRangePicker 范围类型'date' | 'month' | 'year' | 'quarter' | 'week''date'
modelValue绑定值string | number | Date | Array<string | number | Date>undefined
defaultValue默认值string | number | Date | Array<string | number | Date>undefined
pickerValue面板显示日期string | number | Date | Array<string | number | Date>undefined
defaultPickerValue默认面板显示日期string | number | Date | Array<string | number | Date>undefined
placeholder占位文案string | string[]按类型生成
disabled是否禁用boolean | boolean[]false
readonly是否只读booleanfalse
disabledInput禁止输入框键盘输入但允许面板选择booleanfalse
inputReadOnly输入框只读,常用于移动端避免软键盘booleanfalse
error是否错误态booleanfalse
allowClear是否允许清除booleantrue
format展示和解析格式string按类型生成
valueFormat值格式'timestamp' | 'Date' | stringformat 一致
size输入框尺寸'mini' | 'small' | 'medium' | 'large'继承 Form / medium
dayStartOfWeek每周起始日0 | 1 | 2 | 3 | 4 | 5 | 60
disabledDate禁用日期(current: Date, type?: 'start' | 'end') => booleanundefined
hideNotInViewDates隐藏非当前月份日期booleanfalse
popupVisible控制弹层显示booleanundefined
defaultPopupVisible默认弹层显示booleanfalse
position弹出位置'top' | 'tl' | 'tr' | 'bottom' | 'bl' | 'br''bl'
popupContainer弹层挂载容器string | HTMLElementundefined
triggerProps透传 Trigger 配置Partial<TriggerProps>undefined
unmountOnClose关闭后销毁面板booleanfalse
shortcuts快捷项DatePickerShortcut[][]
showToday是否显示今天 / 本月 / 今年按钮booleantrue
showConfirmBtn是否显示确认按钮booleanfalse
showTime是否开启日期时间选择,仅 date / date-range 生效booleanfalse
timePickerProps时间列配置,支持 formatstepuse12HoursdisabledHoursdisabledMinutesdisabledSecondshideDisabledOptionsdefaultValueobjectundefined
disabledTime禁用时间,需要配合 showTime 使用(current?: Date, type?: 'start' | 'end') => objectundefined
showLunar是否展示中国农历辅助信息,支持控制农历日期、农历节日、节气和公历节日boolean | { showLunarDate?: boolean; showLunarFestival?: boolean; showSolarTerm?: boolean; showSolarFestival?: boolean; fallbackText?: string }false

DatePicker Events

事件名说明参数
update:modelValue值更新value
update:pickerValue面板值更新value
change确认值变化value, date, dateString
select面板选择但未必提交value, date, dateString
calendar-change范围选择中间态变化value, date, dateString, info
clear点击清除event
ok点击确定value, date, dateString
popup-visible-change弹层显示状态变化visible
update:popupVisible受控弹层更新visible
picker-value-change面板视图日期改变value, date, dateString
select-shortcut点击快捷项shortcut
focus输入框聚焦event
blur输入框失焦event

DatePicker Slots

插槽名说明
prefix输入框前缀
suffix-icon输入框后缀图标
separator范围输入分隔符
cell自定义日期单元格
extra面板快捷区额外内容

DatePicker Methods

方法说明
focus()聚焦输入框
blur()失焦输入框

交互说明

  • showTime 仅在日期和日期范围模式生效,默认格式为 YYYY-MM-DD HH:mm:ss,选择后需要点击“确定”提交。
  • showLunar 仅影响日期格辅助展示,不改变 modelValueformat、范围排序或禁用逻辑;内置数据来自香港天文台 1901-2100 年公历 / 农历对照表,超出范围时默认不展示。
  • 非法手动输入不会提交新值;按 Enter 或失焦时会尝试按 format 解析。
  • 普通范围选择会在选择结束值后自动排序并提交;开启 showTime 后需要点击“确定”提交。
  • valueFormat="timestamp" 会让绑定值和事件值返回时间戳。