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>
large
medium
small
mini

尺寸选择

通过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小时制,须和 Aa 使用;不补0 3
hh 小时 12小时制,须和 Aa 使用 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

日期格式化

默认为 Date 对象
值:
使用 value-format
值:
时间戳
值:
分隔符
值:

日期格式化

通过设置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 选中日期后会执行的回调,只有当 daterangedatetimerange 才生效 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前端组
上次更新: 4/15/2020, 5:19:35 PM