Ant Design Vue DatePicker选择开始日期和结束日期(日期范围选择)

我们开发系统时可能会遇到这些场景比如酒店入住日期和退房日期、机票往返日期选择、出差开始日期和结束日期等等这些场景可以通过DatePicker的RangePicker组件实现。

RangePicker组件实现

以下代码演示了常用日期范围及不可选日期,最少选择5天(比如预定房间天数必须大于等于5天)

<template>
  <div>
    <a-locale-provider :locale="locale">
      <a-range-picker
        @change="onChange"
        @calendarChange="calendarChange"
        :ranges="ranges"
        :disabledDate="disabledDate"
      />
    </a-locale-provider>
  </div>
</template>
<script>
import zhCN from "ant-design-vue/lib/locale-provider/zh_CN";
import moment from "moment";
export default {
  data() {
    return {
      selectDate: null,
      //中文本地化
      locale: zhCN,
      //预设常用日期范围快捷方式
      ranges: {
        一月内: () => [
          moment("2020-10-10", "YYYY:MM:DD"),
          moment("2020-11-10", "YYYY:MM:DD")
        ],
        昨天: () => [
          moment()
            .startOf("day")
            .subtract(1, "days"),
          moment()
            .endOf("day")
            .subtract(1, "days")
        ],
        最近一周: () => [
          moment()
            .startOf("day")
            .subtract(1, "weeks"),
          moment()
        ]
      }
    };
  },
  methods: {
    moment,
    //不可选日期
    disabledDate(current) {
      if (this.selectDate != null) {
        return current < this.selectDate;
      } else {
        return current < moment().endOf("day");
      }
    },
    //选中日期事件
    calendarChange(date, dateString) {
      if (date.length <= 1) {
        //选中开始日期事件,设置结束日期必须大于5天
        this.selectDate = date[0].add(5, "days");
      } else {
        this.selectDate = null;
      }
    },
    //选择后的事件
    onChange(date, dateString) {
      console.log(date, dateString);
    }
  }
};
</script>

以上代码为node.js webpack开发方式,如果你是使用cdn引入js方式开发请点击在线试一试查看代码。

在线试一试

浏览器引入js方式

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <title>Ant Design Vue range-picker日期范围选择例子</title>
    <script src="https://www.itxst.com/package/ant-design-vue/moment.js"></script>
    <script src="https://www.itxst.com/package/vue/vue.min.js"></script>
    <script src="https://www.itxst.com/package/ant-design-vue/antd.js"></script>
    <link href="https://www.itxst.com/package/ant-design-vue/antd.min.css" rel="stylesheet" />
    <script src="https://www.itxst.com/package/ant-design-vue/antd-with-locales.js"></script>
    <style>
        body {
            padding-top: 10px
        }
    </style>
</head>
<body>
    <div id="app">
        <div :style="{  paddingBottom:'10px' }">
            <a-locale-provider :locale="locales.zh_CN">
                <a-range-picker @change="onChange" :ranges="ranges"></a-range-picker>
            </a-locale-provider>
        </div>
    </div>
    <script>
        const { LocaleProvider, locales } = window.antd;
        var app = new Vue({
            el: '#app',
            data() {
                return {
                    locales,
                    ranges: {
                        '一月内': () => [moment('2020-10-10', 'YYYY:MM:DD'), moment('2020-11-10', 'YYYY:MM:DD')],
                        '昨天': () => [moment().startOf('day').subtract(1, 'days'), moment().endOf('day').subtract(1, 'days')],
                        '最近一周': () => [moment().startOf('day').subtract(1, 'weeks'), moment()]
                    },
                };
            },
            methods: {
                moment,
                onChange(date, dateString) {
                    console.log(date, dateString);
                }
            },
            created: function () {
                // 里面的字符可以根据自己的需要进行调整
                moment.locale('zh-cn', {
                    months: '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),
                    monthsShort: '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),
                    weekdays: '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),
                    weekdaysShort: '周日_周一_周二_周三_周四_周五_周六'.split('_'),
                    weekdaysMin: '日_一_二_三_四_五_六'.split('_'),
                    longDateFormat: {
                        LT: 'HH:mm',
                        LTS: 'HH:mm:ss',
                        L: 'YYYY-MM-DD',
                        LL: 'YYYY年MM月DD日',
                        LLL: 'YYYY年MM月DD日Ah点mm分',
                        LLLL: 'YYYY年MM月DD日ddddAh点mm分',
                        l: 'YYYY-M-D',
                        ll: 'YYYY年M月D日',
                        lll: 'YYYY年M月D日 HH:mm',
                        llll: 'YYYY年M月D日dddd HH:mm'
                    },
                    meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,
                    meridiemHour: function (hour, meridiem) {
                        if (hour === 12) {
                            hour = 0;
                        }
                        if (meridiem === '凌晨' || meridiem === '早上' ||
                            meridiem === '上午') {
                            return hour;
                        } else if (meridiem === '下午' || meridiem === '晚上') {
                            return hour + 12;
                        } else {
                            // '中午'
                            return hour >= 11 ? hour : hour + 12;
                        }
                    },
                    meridiem: function (hour, minute, isLower) {
                        const hm = hour * 100 + minute;
                        if (hm < 600) {
                            return '凌晨';
                        } else if (hm < 900) {
                            return '早上';
                        } else if (hm < 1130) {
                            return '上午';
                        } else if (hm < 1230) {
                            return '中午';
                        } else if (hm < 1800) {
                            return '下午';
                        } else {
                            return '晚上';
                        }
                    },
                    calendar: {
                        sameDay: '[今天]LT',
                        nextDay: '[明天]LT',
                        nextWeek: '[下]ddddLT',
                        lastDay: '[昨天]LT',
                        lastWeek: '[上]ddddLT',
                        sameElse: 'L'
                    },
                    dayOfMonthOrdinalParse: /\d{1,2}(日|月|周)/,
                    ordinal: function (number, period) {
                        switch (period) {
                            case 'd':
                            case 'D':
                            case 'DDD':
                                return number + '日';
                            case 'M':
                                return number + '月';
                            case 'w':
                            case 'W':
                                return number + '周';
                            default:
                                return number;
                        }
                    },
                    relativeTime: {
                        future: '%s内',
                        past: '%s前',
                        s: '几秒',
                        ss: '%d秒',
                        m: '1分钟',
                        mm: '%d分钟',
                        h: '1小时',
                        hh: '%d小时',
                        d: '1天',
                        dd: '%d天',
                        M: '1个月',
                        MM: '%d个月',
                        y: '1年',
                        yy: '%d年'
                    },
                    week: {
                        // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
                        dow: 1, // Monday is the first day of the week.
                        doy: 4  // The week that contains Jan 4th is the first week of the year.
                    }
                })
            },
        });
    </script>
</body>
</html>