Date-picker 日期选择器
代码演示
WARNING
可直接在输入框内输入正确日期格式;格式类型:20190101、2019-01-01、2019年01月01日等;输入框展示以format类型为标准,默认间隔符: -
选择日
基础的日期选择组件。
查看代码 < />
<template>
<w-date-picker
type="date"
v-model="value1"
format="yyyy 年 MM 月 dd 日"
placeholder=" 年 月 日"
></w-date-picker>
</template>
<script>
export default {
data () {
return {
value1: ''
}
}
}
</script>
选择日
当size设置成small或者mini,此时popover内容会变小,多用于弹框中使用。
查看代码 < />
<template>
<w-date-picker
type="date"
v-model="value1"
size="small">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value1: ''
}
}
}
</script>
选择周
查看代码 < />
<template>
<section class="date-picker-demo">
<w-date-picker type="week"
format="yyyy 第 WW 周"
v-model="value1"
placeholder="请选择周">
</w-date-picker>
</section>
</template>
<script>
export default {
data() {
return {
value1: ''
}
}
}
</script>
选择月
扩展基础的日期选择,可以选择月份。
查看代码 < />
<template>
<w-date-picker v-model="value1" type="month" placeholder="选择月">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value1: ''
}
}
}
</script>
选择年
扩展基础的日期选择,可以选择年份。
查看代码 < />
<template>
<w-date-picker v-model="value1" type="year" placeholder="选择年">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value1: ''
}
}
}
</script>
WARNING
demo中的TheDateInputs组件为项目试验性业务组件, 尚不成熟, 因此暂不开放使用. 仅提供自定义输入框的能力. 请开发者注意.
自定义输入框
通过slot的方式可以替换日期选择器内置w-input组件, 将输入能力完全暴露给外部组件. 通过w-date-picker组件对日期面板显示与隐藏的控制能力, 可以达到自定义输入形式的目的.
查看代码 < />
<template>
<w-date-picker :value="date" :open="openDatePicker"
type="date" format="yyyy - MM - dd"
value-format="yyyy-MM-dd"
placeholder="请选择日期"
@input="setDate"
@pick="setDate"
@open-change="val => openDatePicker = val">
<date-inputs v-model="dateInputs"
@toggle-date-picker="onToggleDatePicker" />
</w-date-picker>
</template>
<script>
// 请根据业务需求自行开发DateInputs组件
import DateInputs from '../business-components/TheDateInputs'
import { validateDate } from './utils'
export default {
data () {
return {
openDatePicker: false,
date: '',
dateInputs: '',
}
},
components: {
DateInputs
},
methods: {
onToggleDatePicker() {
if (!validateDate(this.date)) {
this.setDate('')
}
this.openDatePicker = !this.openDatePicker
},
setDate(val) {
this.date = this.dateInputs = val
}
},
watch: {
dateInputs(val) {
if (validateDate(val)) {
this.date = val
}
}
}
}
</script>
带快捷键
通过picker-options设置快捷选项。
查看代码 < />
<template>
<section class="date-picker-demo">
<w-date-picker
v-model="value2"
type="date"
:picker-options="pickerOptions"
placeholder="请选择日期">
</w-date-picker>
</section>
</template>
<script>
export default {
data () {
return {
value2: '',
pickerOptions: {
disabledDate(time) {
return time.getTime() > Date.now();
},
shortcuts: [{
text: '今天',
onClick(picker) {
picker.$emit('pick', new Date());
}
}, {
text: '昨天',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24);
picker.$emit('pick', date);
}
}, {
text: '一周前',
onClick(picker) {
const date = new Date();
date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', date);
}
}]
}
}
}
}
</script>
选择多个日期
当type属性为dates时,可以选择多个日期。
查看代码 < />
<template>
<w-date-picker v-model="value1" type="dates" placeholder="选择多个日期">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value1: ''
}
}
}
</script>
自定义日期范围选择
当 RangePicker 无法满足业务需求时,可以使用两个 DatePicker 实现类似的功能。通过 open 设置是否自动展开结束日期。
查看代码 < />
<template>
<section class="date-picker-demo">
<w-date-picker :picker-options="pickerOptionsStart"
format="yyyy-MM-dd"
v-model="startValue"
@open-change="handleStartOpenChange"
placeholder="开始日期">
</w-date-picker>
<div class="range-separator"><span>至</span></div>
<w-date-picker :picker-options="pickerOptionsEnd"
format="yyyy-MM-dd"
placeholder="结束日期"
v-model="endValue"
:open="endOpen"
@open-change="handleEndOpenChange">
</w-date-picker>
</section>
</template>
<script>
export default {
data() {
return {
startValue: null,
endValue: null,
endOpen: false,
pickerOptionsStart: {
disabledDate: startValue => {
const endValue = this.endValue;
if (!startValue || !endValue) {
return false;
}
return startValue.valueOf() > endValue.valueOf();
},
},
pickerOptionsEnd: {
disabledDate: endValue => {
const startValue = this.startValue;
if (!endValue || !startValue) {
return false;
}
return startValue.valueOf() >= endValue.valueOf();
},
},
}
},
computed: {
},
watch: {
startValue(val) {
console.log('startValue', val);
},
endValue(val) {
console.log('endValue', val);
},
},
methods: {
handleStartOpenChange(open) {
if (!open) this.endOpen = true;
},
handleEndOpenChange(open) {
this.endOpen = open;
},
},
}
</script>
<style scoped lang="scss">
.date-picker-demo {
.w-date-editor {
margin: 0 10px;
}
.range-separator {
display: inline-block;
line-height: 32px;
vertical-align: middle;
font-size: 14px;
}
}
</style>
日期范围
在选择日期范围时,默认情况下左右面板会联动。如果希望两个面板各自独立切换当前月份,可以使用unlink-panels属性解除联动。
查看代码 < />
<template>
<w-date-picker v-model="value3"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value3: ''
}
}
}
</script>
选择月范围
在选择月份范围时,默认情况下左右面板会联动。如果希望两个面板各自独立切换当前年份,可以使用unlink-panels属性解除联动。
查看代码 < />
<template>
<w-date-picker v-model="value4"
size="medium"
type="monthrange"
range-separator="至"
start-placeholder="开始月份"
end-placeholder="结束月份">
</w-date-picker>
</template>
<script>
export default {
data () {
return {
value4: ''
}
}
}
</script>
尺寸选择
通过size设置不同尺寸的日期选择。
查看代码 < />
<template>
<section class="date-picker-size-demo">
<div class="wrapper">
<div class="container">
<div class="block">
<span class="demonstration">large</span>
<w-date-picker type="date"
v-model="value5"
size="large"
placeholder="请选择日期">
</w-date-picker>
</div>
<div class="block">
<span class="demonstration">medium</span>
<w-date-picker type="date"
v-model="value6"
size="medium"
placeholder="请选择日期">
</w-date-picker>
</div>
</div>
<div class="container">
<div class="block">
<span class="demonstration">small</span>
<w-date-picker type="date"
v-model="value7"
size="small"
placeholder="请选择日期">
</w-date-picker>
</div>
<div class="block">
<span class="demonstration">mini</span>
<w-date-picker type="date"
v-model="value8"
size="mini"
placeholder="请选择日期">
</w-date-picker>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
data () {
return {
value5: '',
value6: '',
value7: '',
value8: ''
}
}
}
</script>
<style scoped lang="scss">
.date-picker-size-demo {
.wrapper {
padding: 0;
display: flex;
flex-wrap: wrap;
}
.container {
flex: 1;
.block {
padding: 30px 0;
text-align: center;
min-height: 90px;
border-right: 1px solid #eff2f6;
flex: 1;
&:last-child {
border-top: 1px solid #eff2f6;
}
.demonstration {
display: block;
color: #8492a6;
font-size: 14px;
margin-bottom: 20px;
}
}
}
}
</style>
日期格式
默认情况下,组件接受并返回Date
对象。以下为可用的格式化字串,以 UTC 2017年1月2日 03:04:05 为例:
WARNING
请注意大小写
格式 | 含义 | 备注 | 举例 |
---|---|---|---|
yyyy | 年 | 2017 | |
M | 月 | 不补0 | 1 |
MM | 月 | 01 | |
W | 周 | 仅周选择器的 format 可用;不补0 | 1 |
WW | 周 | 仅周选择器的 format 可用 | 01 |
d | 日 | 不补0 | 2 |
dd | 日 | 02 | |
H | 小时 | 24小时制;不补0 | 3 |
HH | 小时 | 24小时制 | 03 |
h | 小时 | 12小时制,须和 A 或 a 使用;不补0 | 3 |
hh | 小时 | 12小时制,须和 A 或 a 使用 | 03 |
m | 分钟 | 不补0 | 4 |
mm | 分钟 | 04 | |
s | 秒 | 不补0 | 5 |
ss | 秒 | 05 | |
A | AM/PM | 仅 format 可用,大写 | AM |
a | am/pm | 仅 format 可用,小写 | am |
timestamp | JS时间戳 | 仅 value-format 可用;组件绑定值为number 类型 | 1483326245000 |
日期格式化
日期格式化
通过设置format属性,可以格式化日期数据。
查看代码 < />
<template>
<section class="date-picker-format-demo">
<div class="wrapper">
<div class="container">
<div class="block">
<span class="demonstration">默认为 Date 对象</span>
<div class="demonstration">值:{{ value9 }}</div>
<w-date-picker type="date"
v-model="value9"
format="yyyy 年 MM 月 dd 日"
placeholder="请选择日期">
</w-date-picker>
</div>
<div class="block">
<span class="demonstration">使用 value-format</span>
<div class="demonstration">值:{{ value10 }}</div>
<w-date-picker type="date"
v-model="value10"
format="yyyy 年 MM 月 dd 日"
value-format="yyyy-MM-dd"
placeholder="请选择日期">
</w-date-picker>
</div>
</div>
<div class="container">
<div class="block">
<span class="demonstration">时间戳</span>
<div class="demonstration">值:{{ value11 }}</div>
<w-date-picker type="date"
v-model="value11"
format="yyyy 年 MM 月 dd 日"
value-format="timestamp"
placeholder="请选择日期">
</w-date-picker>
</div>
<div class="block">
<span class="demonstration">分隔符</span>
<div class="demonstration">值:{{ value12 }}</div>
<w-date-picker type="date"
v-model="value12"
format="yyyy / MM / dd"
value-format="yyyy/MM/dd"
placeholder="请选择日期">
</w-date-picker>
</div>
</div>
</div>
</section>
</template>
<script>
export default {
data () {
return {
value9: '',
value10: '',
value11: '',
value12: ''
}
}
}
</script>
<style scoped lang="scss">
.date-picker-format-demo {
.wrapper {
padding: 0;
display: flex;
flex-wrap: wrap;
}
.container {
flex: 1;
border-right: 1px solid #eff2f6;
&:last-child {
border-right: none;
}
.block {
padding: 30px 0;
text-align: center;
min-height: 140px;
flex: 1;
&:last-child {
border-top: 1px solid #eff2f6;
}
.demonstration {
display: block;
color: #8492a6;
font-size: 14px;
margin-bottom: 20px;
}
}
}
}
</style>
API
Attributes
参数 | 说明 | 类型 | 可选值 | 默认值 | Version |
---|---|---|---|---|---|
align | 对齐方式 | String | left, center, right | left | |
clear-icon | 自定义清空图标的类名 | String | — | w-icon-close | |
clearable | 是否显示清除按钮 | Boolean | — | true | |
disabled | 禁用 | Boolean | — | false | |
default-value | 可选,选择器打开时默认显示的时间 | Date | 可被new Date() 解析 | — | |
default-time | 范围选择时选中日期所使用的当日内具体时刻 | String[] | 数组,长度为 2,每项值为字符串,形如12:00:00 ,第一项指定开始日期的时刻,第二项指定结束日期的时刻,不指定会使用时刻 00:00:00 | — | |
editable | 文本框可输入 | Boolean | — | true | |
end-placeholder | 范围选择时结束日期的占位内容 | String | — | — | |
format | 显示在输入框中的格式 | String | 见日期格式 | yyyy-MM-dd | |
name | 原生属性 | string | — | — | |
placeholder | 非范围选择时的占位内容 | String | — | — | |
popper-class | DatePicker 下拉框的类名 | String | — | — | |
picker-options | 当前时间日期选择器特有的选项参考下表 | Object | — | {} | |
readonly | 完全只读 | Boolean | — | false | |
range-separator | 选择范围时的分隔符 | String | — | '-' | |
size | 输入框尺寸 | String | large, medium, small, mini | medium | |
start-placeholder | 范围选择时开始日期的占位内容 | String | — | — | |
suffix-icon | 自定义尾部图标的类名 | String | — | w-icon-date | |
type | 显示类型 | String | year/month/date/dates/ week/datetime/datetimerange/ daterange/monthrange | date | |
unlink-panels | 在范围选择器里取消两个日期面板之间的联动 | Boolean | — | false | |
value / v-model | 绑定值 | Date(DatePicker) / Array(DateRangePicker) | — | — | |
value-format | 可选,绑定值的格式。不指定则绑定值为 Date 对象 | String | 见日期格式 | — | |
validate-event | 输入时是否触发表单的校验 | Boolean | — | true | |
open | 控制弹层是否展开 | Boolean | — | false | v1.4.4 |
Picker Options
参数 | 说明 | 类型 | 可选值 | 默认值 | Version |
---|---|---|---|---|---|
disabledDate | 设置禁用状态,参数为当前日期,要求返回 Boolean | Function | — | — | |
firstDayOfWeek | 周起始日 | Number | 1 到 7 | 7 | |
onPick | 选中日期后会执行的回调,只有当 daterange 或 datetimerange 才生效 | Function({ maxDate, minDate }) | — | — | |
shortcuts | 设置快捷选项,需要传入 { text, onClick } 对象用法参考 demo 或下表 | Object[] | — | — |
Shortcuts
参数 | 说明 | 类型 | 可选值 | 默认值 | Version |
---|---|---|---|---|---|
onClick | 选中后的回调函数,参数是 vm,可通过触发 'pick' 事件设置选择器的值。例如 vm.$emit('pick', new Date()) | Function | — | — | |
text | 标题文本 | String | — | — |
Events
事件名称 | 说明 | 回调参数 | Version |
---|---|---|---|
blur | 当 input 失去焦点时触发 | 组件实例 | |
change | 用户确认选定的值时触发 | 组件绑定值。格式与绑定值一致,可受 value-format 控制 | |
focus | 当 input 获得焦点时触发 | 组件实例 | |
open-change | 弹出和关闭的回调 | function(status) | v1.4.4 |
Methods
方法名 | 说明 | 参数 | Version |
---|---|---|---|
focus | 使 input 获取焦点 | — |
Slot
参数 | 说明 | Version |
---|---|---|
— | 输入框元素 | v1.4.13 |
贡献者
类型 | 参与者 |
---|---|
设计者 | UED视觉组 |
维护者 | UED前端组 |