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前端组 |