DatePicker 日期选择
输入框 + 月历面板 —— 日 / 月 / 年三视图、约束日期、快捷预设、ISO 周序、键盘导航。
基础用法
v-model 绑定 'YYYY-MM-DD' 格式字符串。点击触发器弹出月历面板,再点击日期格子直接选中并关闭。点击月份名进入月份选择,点击年份进入年份选择。
背景
2026-05-09<script setup lang="ts">
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>('2026-05-09');
</script>
<template>
<div style="display: flex; gap: 12px; align-items: center;">
<CfDatePicker v-model="value" clearable />
<code style="font-size: 12px;">{{ value ?? '(无)' }}</code>
</div>
</template> <script setup>
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>('2026-05-09');
</script>
<template>
<div style="display: flex; gap: 12px; align-items: center;">
<CfDatePicker v-model="value" clearable />
<code style="font-size: 12px;">{{ value ?? '(无)' }}</code>
</div>
</template> import { useState } from 'react';
import { CfDatePicker } from '@chufix-design/react';
export default function Demo() {
const [value, setValue] = useState<string | null>('2026-05-09');
return <CfDatePicker value={value} clearable onChange={(v) => setValue(v)} />;
} import { useState } from 'react';
import { CfDatePicker } from '@chufix-design/react';
export default function Demo() {
const [value, setValue] = useState<string | null>('2026-05-09');
return <CfDatePicker value={value} clearable onChange={(v) => setValue(v)} />;
} 范围 + disabledDate
minDate / maxDate 限制可选区间;disabledDate 是一个 (date: Date) => boolean 回调,返回 true 的日期会被打上删除线、禁止点击。
背景
<script setup lang="ts">
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>(null);
function noWeekends(d: Date) {
const day = d.getDay();
return day === 0 || day === 6;
}
</script>
<template>
<CfDatePicker
v-model="value"
placeholder="工作日,2026 全年"
min-date="2026-01-01"
max-date="2026-12-31"
:disabled-date="noWeekends"
clearable
/>
</template> <script setup>
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>(null);
function noWeekends(d) {
const day = d.getDay();
return day === 0 || day === 6;
}
</script>
<template>
<CfDatePicker
v-model="value"
placeholder="工作日,2026 全年"
min-date="2026-01-01"
max-date="2026-12-31"
:disabled-date="noWeekends"
clearable
/>
</template> import { useState } from 'react';
import { CfDatePicker } from '@chufix-design/react';
const noWeekends = (d: Date) => d.getDay() === 0 || d.getDay() === 6;
export default function Demo() {
const [value, setValue] = useState<string | null>(null);
return (
<CfDatePicker
value={value}
minDate="2026-01-01"
maxDate="2026-12-31"
disabledDate={noWeekends}
clearable
onChange={(v) => setValue(v)}
/>
);
} import { useState } from 'react';
import { CfDatePicker } from '@chufix-design/react';
const noWeekends = (d) => d.getDay() === 0 || d.getDay() === 6;
export default function Demo() {
const [value, setValue] = useState<string | null>(null);
return (
<CfDatePicker
value={value}
minDate="2026-01-01"
maxDate="2026-12-31"
disabledDate={noWeekends}
clearable
onChange={(v) => setValue(v)}
/>
);
} 显示格式
format 控制触发器上显示的格式(不影响 v-model 的存储格式,存储始终是 'YYYY-MM-DD')。支持 token:YYYY YY MM M DD D。
背景
<script setup lang="ts">
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const a = ref<string | null>('2026-05-09');
const b = ref<string | null>('2026-05-09');
const c = ref<string | null>('2026-05-09');
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 8px; max-width: 320px;">
<CfDatePicker v-model="a" format="YYYY-MM-DD" />
<CfDatePicker v-model="b" format="YYYY 年 M 月 D 日" />
<CfDatePicker v-model="c" format="DD/MM/YYYY" />
</div>
</template> <script setup>
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const a = ref<string | null>('2026-05-09');
const b = ref<string | null>('2026-05-09');
const c = ref<string | null>('2026-05-09');
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 8px; max-width: 320px;">
<CfDatePicker v-model="a" format="YYYY-MM-DD" />
<CfDatePicker v-model="b" format="YYYY 年 M 月 D 日" />
<CfDatePicker v-model="c" format="DD/MM/YYYY" />
</div>
</template> <CfDatePicker value={a} format="YYYY-MM-DD" onChange={(v) => setA(v)} />
<CfDatePicker value={b} format="YYYY 年 M 月 D 日" onChange={(v) => setB(v)} />
<CfDatePicker value={c} format="DD/MM/YYYY" onChange={(v) => setC(v)} /> <CfDatePicker value={a} format="YYYY-MM-DD" onChange={(v) => setA(v)} />
<CfDatePicker value={b} format="YYYY 年 M 月 D 日" onChange={(v) => setB(v)} />
<CfDatePicker value={c} format="DD/MM/YYYY" onChange={(v) => setC(v)} /> 快捷预设
presets 接受一个 { label, value } 数组,在面板左侧渲染一列预设按钮。value 可以是固定 Date / ISO 字符串,或是一个返回它们的函数(每次点击重新求值,适合”今天” / “7 天前”这类相对日期)。
背景
<script setup lang="ts">
import { ref } from 'vue';
import { CfDatePicker, type DatePickerPreset } from '@chufix-design/vue';
const value = ref<string | null>(null);
const presets: DatePickerPreset[] = [
{ label: '今天', value: () => new Date() },
{
label: '昨天',
value: () => {
const d = new Date();
d.setDate(d.getDate() - 1);
return d;
},
},
{
label: '7 天前',
value: () => {
const d = new Date();
d.setDate(d.getDate() - 7);
return d;
},
},
{
label: '本月 1 号',
value: () => {
const d = new Date();
return new Date(d.getFullYear(), d.getMonth(), 1);
},
},
{
label: '上月 1 号',
value: () => {
const d = new Date();
return new Date(d.getFullYear(), d.getMonth() - 1, 1);
},
},
];
</script>
<template>
<CfDatePicker v-model="value" clearable :presets="presets" />
</template> <script setup>
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>(null);
const presets= [
{ label: '今天', value: () => new Date() },
{
label: '昨天',
value: () => {
const d = new Date();
d.setDate(d.getDate() - 1);
return d;
},
},
{
label: '7 天前',
value: () => {
const d = new Date();
d.setDate(d.getDate() - 7);
return d;
},
},
{
label: '本月 1 号',
value: () => {
const d = new Date();
return new Date(d.getFullYear(), d.getMonth(), 1);
},
},
{
label: '上月 1 号',
value: () => {
const d = new Date();
return new Date(d.getFullYear(), d.getMonth() - 1, 1);
},
},
];
</script>
<template>
<CfDatePicker v-model="value" clearable :presets="presets" />
</template> ISO 周序
show-week-number 在日期网格左侧加一列 ISO 8601 周数(周一为一周起点)。
背景
<script setup lang="ts">
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>(null);
</script>
<template>
<CfDatePicker v-model="value" clearable show-week-number />
</template> <script setup>
import { ref } from 'vue';
import { CfDatePicker } from '@chufix-design/vue';
const value = ref<string | null>(null);
</script>
<template>
<CfDatePicker v-model="value" clearable show-week-number />
</template> 键盘导航
面板打开时支持以下按键:
| 按键 | 行为 |
|---|---|
← / → / ↑ / ↓ | 在日期网格上移动焦点 |
PageUp / PageDown | 上一月 / 下一月 |
Home / End | 跳到本月第一天 / 最后一天 |
Enter | 选中当前 focus 的日期 |
Esc | 关闭面板 |
API
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue (Vue) / value (React) | Date | string | number | null | null | 当前日期,输入容忍 ISO / 时间戳 / Date |
format | string | 'YYYY-MM-DD' | 触发器显示格式 |
placeholder | string | '选择日期' | 占位文案 |
variant | 'outline' | 'filled' | 'ghost' | 'outline' | 触发器视觉模式 |
size | 'sm' | 'md' | 'lg' | 'md' | 尺寸 |
disabled | boolean | false | 禁用 |
clearable | boolean | false | 显示清除按钮 |
error | boolean | false | 错误态 |
minDate / maxDate | DateLike | — | 可选范围 |
disabledDate | (date: Date) => boolean | — | 自定义禁用规则 |
weekStartsOn | 0 | 1 | 1 | 0 = 周日开头,1 = 周一开头 |
view | 'day' | 'month' | 'year' | 'day' | 初始打开视图 |
showWeekNumber | boolean | false | 在日期网格前加一列 ISO 周序 |
presets | DatePickerPreset[] | — | 快捷预设按钮:{ label, value: Date | string | () => ... } |
事件:update:modelValue / change(React 端:onChange(value, date),第二参数是 Date \| null)。
反馈与讨论
DatePicker 日期选择 的讨论