日期选择 DatePicker
选择日期的用户界面控件,提供了一个直观的方式让用户通过点击日历来选择特定的日期。
基础用法
日期选择器的基础用法,通过 v-model 绑定日期值。
vue
<template>
<bp-date-picker v-model="val" :disabledDate style="width: 200px" placeholder="请选择" />
</template>
<script setup lang="ts">
import dayjs from "dayjs";
import { ref } from "vue";
const val = ref();
const disabledDate = (current) => dayjs(current).isBefore(dayjs("2025-05-22"));
</script>日期范围
通过 date-range-picker 选择日期范围,绑定值为字符串数组。开启 show-time 后可同时选择时间,面板下方展示起止日期/时间,确认后写入;default-time 可指定默认起止时刻(默认 ['00:00:00', '23:59:59'])。
日期范围
-
当前值:[]
日期时间范围
-
当前值:[]
vue
<template>
<div style="display: flex; gap: 40px; flex-wrap: wrap">
<div>
<div class="label">日期范围</div>
<bp-date-range-picker v-model="val" style="width: 320px" :placeholder="['开始日期', '结束日期']" />
<div class="value">当前值:{{ val }}</div>
</div>
<div>
<div class="label">日期时间范围</div>
<bp-date-range-picker
v-model="valTime"
show-time
:default-time="['00:00:00', '23:59:59']"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 400px"
:placeholder="['开始时间', '结束时间']"
/>
<div class="value">当前值:{{ valTime }}</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
const val = ref<string[]>([]);
const valTime = ref<string[]>([]);
</script>
<style scoped>
.label {
font-size: 13px;
color: #86909c;
margin-bottom: 6px;
}
.value {
font-size: 13px;
color: #4e5969;
margin-top: 8px;
}
</style>快捷选项
范围面板默认在左侧展示快捷选项(近7天 / 近30天 / 近一年)。可通过 range-shortcuts 自定义或设为 false 关闭,shortcuts-position 控制左右位置。
默认快捷选项
-
当前值:[]
自定义快捷选项(右侧)
-
当前值:[]
vue
<template>
<div style="display: flex; gap: 40px; flex-wrap: wrap">
<div>
<div class="label">默认快捷选项</div>
<bp-date-range-picker v-model="val" style="width: 320px" :placeholder="['开始日期', '结束日期']" />
<div class="value">当前值:{{ val }}</div>
</div>
<div>
<div class="label">自定义快捷选项(右侧)</div>
<bp-date-range-picker
v-model="valCustom"
style="width: 320px"
shortcuts-position="right"
:range-shortcuts="customShortcuts"
:placeholder="['开始日期', '结束日期']"
/>
<div class="value">当前值:{{ valCustom }}</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import dayjs from "dayjs";
import type { RangeShortcut } from "birdpaper-ui";
const val = ref<string[]>([]);
const valCustom = ref<string[]>([]);
const customShortcuts: RangeShortcut[] = [
{
label: "未来 2 天",
value: () => [dayjs(), dayjs().add(2, "day")],
},
{
label: "未来 7 天",
value: () => [dayjs(), dayjs().add(1, "week")],
},
{
label: "未来 30 天",
value: () => [dayjs(), dayjs().add(1, "month")],
},
{
label: "未来 6 个月",
value: () => [dayjs(), dayjs().add(6, "month")],
},
{
label: "未来一年",
value: () => [dayjs(), dayjs().add(1, "year")],
},
];
</script>
<style scoped>
.label {
font-size: 13px;
color: #86909c;
margin-bottom: 6px;
}
.value {
font-size: 13px;
color: #4e5969;
margin-top: 8px;
}
</style>选择时间
通过开启 show-time 属性以支持时间选择,value-format 自定义输出格式。
vue
<template>
<bp-date-picker
v-model="val"
value-format="YYYY-MM-DD HH:mm:ss"
show-time
style="width: 200px"
placeholder="请选择"
/>
</template>
<script setup lang="ts">
import { ref } from "vue";
const val = ref();
</script>月份与年份
month-picker 月份选择器,year-picker 年份选择器。
2026
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
vue
<template>
<bp-space type="vertical">
<bp-month-picker v-model="val" style="width: 200px" placeholder="请选择" />
<bp-month-picker v-model="val" hide-trigger style="width: 200px" placeholder="请选择" />
</bp-space>
</template>
<script setup lang="ts">
import { ref } from "vue";
const val = ref();
</script>仅面板
通过开启 hide-trigger 属性直接展示选择面板。
20269月
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
vue
<template>
<bp-date-picker v-model="val" hide-trigger style="width: 200px" placeholder="请选择" />
</template>
<script setup lang="ts">
import { ref } from "vue";
const val = ref();
</script>自定义触发器
通过 #trigger 插槽自定义触发元素(如按钮),作用域参数提供 value(当前值)与 visible(面板是否打开)。DatePicker、DateRangePicker、MonthPicker、YearPicker 均支持。
日期选择
当前值:
日期范围
当前值:[]
vue
<template>
<div style="display: flex; gap: 40px; flex-wrap: wrap; align-items: flex-start">
<div>
<div class="label">日期选择</div>
<bp-date-picker v-model="date">
<template #trigger>
<bp-button type="secondary">选择日期</bp-button>
</template>
</bp-date-picker>
<div class="value">当前值:{{ date }}</div>
</div>
<div>
<div class="label">日期范围</div>
<bp-date-range-picker v-model="range">
<template #trigger>
<bp-button type="secondary">选择日期范围</bp-button>
</template>
</bp-date-range-picker>
<div class="value">当前值:{{ range }}</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
const date = ref("");
const range = ref<string[]>([]);
</script>
<style scoped>
.label {
font-size: 13px;
color: #86909c;
margin-bottom: 6px;
}
.value {
font-size: 13px;
color: #4e5969;
margin-top: 8px;
}
</style>可清空与禁用
clearable 允许清空,disabled 禁用选择器,disabled-date 禁用指定日期。
可清空
禁用
禁用日期
vue
<template>
<div style="display: flex; gap: 40px">
<div>
<div class="label">可清空</div>
<bp-date-picker v-model="val" clearable style="width: 200px" placeholder="请选择" />
</div>
<div>
<div class="label">禁用</div>
<bp-date-picker v-model="val2" disabled style="width: 200px" />
</div>
<div>
<div class="label">禁用日期</div>
<bp-date-picker v-model="val3" :disabled-date="disabledDate" style="width: 200px" placeholder="请选择" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
import dayjs from "dayjs";
const val = ref("");
const val2 = ref("2024-06-15");
const val3 = ref("");
const disabledDate = (current: string) => dayjs(current).isBefore(dayjs().subtract(1, "day"));
</script>
<style scoped>
.label {
font-size: 13px;
color: #86909c;
margin-bottom: 6px;
}
</style>多语言
通过 langs 属性切换语言,支持 zh-cn(默认)和 en。
中文(默认)
英文
vue
<template>
<div style="display: flex; gap: 40px">
<div>
<div class="label">中文(默认)</div>
<bp-date-picker v-model="val" style="width: 200px" placeholder="请选择" />
</div>
<div>
<div class="label">英文</div>
<bp-date-picker v-model="val2" langs="en" style="width: 200px" placeholder="Select" />
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from "vue";
const val = ref("");
const val2 = ref("");
</script>
<style scoped>
.label {
font-size: 13px;
color: #86909c;
margin-bottom: 6px;
}
</style>公共属性
| v-model | 绑定值 | String | - | - |
| name | 选择器名称 | String | - | - |
| size | 输入框尺寸 | InputSize | default | - |
| placeholder | 占位文本 | String | - | - |
| disabled | 是否禁用 | Boolean | false | - |
| disabled-date | 不可选日期 | (value: string) => boolean | - | - |
| clearable | 是否允许清空 | Boolean | false | - |
| hide-trigger | 是否仅展示面板 | Boolean | false | - |
| langs | 语言 | LangsType | zh-cn | - |
DatePicker 属性
| value-format | 值的格式 | String | YYYY-MM-DD | - |
| show-time | 允许选择时间 | Boolean | - | - |
MonthPicker 属性
| value-format | 值的格式 | String | YYYY-MM | - |
YearPicker 属性
| value-format | 值的格式 | String | YYYY | - |
RangePicker 属性
| v-model | 绑定值 | String[] | - | - |
| placeholder | 占位文本 | String[] | ['', ''] | - |
| size | 输入框尺寸 | InputSize | default | - |
| disabled | 是否禁用 | Boolean | false | - |
| disabled-date | 不可选日期 | (value: string) => boolean | - | - |
| hide-trigger | 是否仅展示面板 | Boolean | false | - |
| langs | 语言 | LangsType | zh-cn | - |
| value-format | 值的格式 | String | YYYY-MM-DD | - |
| show-time | 是否显示时间选择 | Boolean | false | - |
| default-time | show-time 时的默认起止时间 | [string, string] | ['00:00:00', '23:59:59'] | - |
| range-shortcuts | 快捷选项。true 使用内置预设,false 关闭,传入数组可自定义 | RangeShortcut[]boolean | true | - |
| shortcuts-position | 快捷选项面板位置 | RangeShortcutsPosition | left | - |
插槽
DatePicker / DateRangePicker / MonthPicker / YearPicker 共用。
| trigger | 自定义触发元素,未传入时使用默认输入框 | { value, visible } | - |