头图

解决elementui的DatePicker 日期选择器,带快捷选项(自定义12个月)的方法

## 废话不多说,线上效果图

效果图

问题描述:网上找了很久,都找不到elementui的DatePicker 日期选择器可以自定义某年某月的快捷选项,elementui的官网例子都是根据当前月份来做的快捷选项

1、自定义带快捷选项的12个月的方法

<template>
    <div class="kingPickerIndex" style="margin: 300px;">
        <el-date-picker
            :default-value="kingDefaultValue"
            popper-class="kingChangePickPanelPaBo"
            ref="elPicker"
            value-format="yyyy-MM-dd"
            format="yyyy-MM-dd"
            v-model="date"
            align="right"
            type="dates"
            placeholder="选择日期"
            :picker-options="pickerOptions"
        ></el-date-picker>
    </div>
</template>

<script>
export default {
    name: 'kingPicker',
    data() {
        return {
            date: null,
            kingDefaultValue: '',
            pickerOptions: {}
        };
    },
    computed: {
        monthList() {
            let monthList = [];
            for (var i = 1; i < 13; i++) {
                monthList.push({
                    label: `${i}月`,
                    value: i
                });
            }
            return monthList;
        }
    },
    mounted() {
        this.initpickerOptions();
    },
    methods: {
        // 初始化picker选择参数
        initpickerOptions() {
            let that = this;
            this.pickerOptions.shortcuts = [];
            // 给date选择器加上12个月的快捷方式
            this.monthList.forEach((item, index) => {
                this.pickerOptions.shortcuts[index] = {};
                this.pickerOptions.shortcuts[index]['text'] = item.label;
                this.pickerOptions.shortcuts[index]['onClick'] =(picker)=> {
                    // 获取选择器中的年份,
                    let curYear = that.$refs['elPicker'].picker.year;
                    // 月份则是用户点击哪个月就是哪个月
                    let curMonth = item.value;
                    // 获取用户选择某年某月的第一天和最后一天
                    let assignMoFiAndAf = that.getAssignMoFiAndAf(curYear, curMonth);
                    let curFirstDay = assignMoFiAndAf.kingFirstDay;
                    let curLastDay = assignMoFiAndAf.kingLastDay;
                    // 获取某年某月的所有日期
                    let curDays = that.getAllDate(curFirstDay, curLastDay);
                    let newcurDays = [];
                    // 设置picker的默认值,解决选择完某月的快捷方式后,重新打开picker后的显示问题
                    that.kingDefaultValue = curDays[0];
                    // 设置赋值给picker的时间值,只有这样才能设置成功(还有其他办法,请大神指教)
                    if (curDays.length > 0) {
                        curDays.forEach(item => {
                            newcurDays.push(new Date(new Date(item).setHours(0, 0, 0, 0)));
                        });
                    }
                    picker.$emit('pick', newcurDays);
                };
            });
        },
        // 获取指定月份的第一天和最后一天
        getAssignMoFiAndAf(y, m) {
            let firstDay = new Date(y, m - 1, 1);
            let lastDay = new Date(y, m, 0);
            let kingFirstDay = this.formatDate(firstDay, 'YYYY-MM-dd');
            let kingLastDay = this.formatDate(lastDay, 'YYYY-MM-dd');
            return {
                kingFirstDay,
                kingLastDay
            };
        },
        // 中国标准时间format yyyy-mm-dd
        formatAllDate(time) {
            let ymd = ''
            let mouth = (time.getMonth() + 1) >= 10 ? (time.getMonth() + 1) : ('0' + (time.getMonth() + 1))
            let day = time.getDate() >= 10 ? time.getDate() : ('0' + time.getDate())
            ymd += time.getFullYear() + '-' // 获取年份。
            ymd += mouth + '-' // 获取月份。
            ymd += day // 获取日。
            return ymd // 返回日期。
        },
        // 格式化日期
        formatDate(date, type) {
            date = new Date(date);
            let myyear = date.getFullYear();
            let mymonth = date.getMonth() + 1;
            let myweekday = date.getDate();
            if (!!type) {
                mymonth < 10 ? (mymonth = '0' + mymonth) : mymonth;
                myweekday < 10 ? (myweekday = '0' + myweekday) : myweekday;
                if (type == 'YYYY-MM-dd') {
                    return `${myyear}-${mymonth}-${myweekday}`;
                } else {
                    return `${myyear}-${mymonth}-${myweekday}`;
                }
            } else {
                return `${mymonth}月${myweekday}日`;
            }
        },
        /*
         **获取开始和结束日期中间的所有日期(包括开始和结束日期)
         **start:开始日期(yyyy-mm-dd)
         **end:结束日期(yyyy-mm-dd)
         */
        getAllDate(start, end) {
            let dateArr = [];
            let startArr = start.split('-');
            let endArr = end.split('-');
            let db = new Date();
            db.setUTCFullYear(startArr[0], startArr[1] - 1, startArr[2]);
            let de = new Date();
            de.setUTCFullYear(endArr[0], endArr[1] - 1, endArr[2]);
            let unixDb = db.getTime();
            let unixDe = de.getTime();
            let stamp;
            const oneDay = 24 * 60 * 60 * 1000;
            for (stamp = unixDb; stamp <= unixDe; ) {
                dateArr.push(this.formatAllDate(new Date(parseInt(stamp))));
                stamp = stamp + oneDay;
            }
            return dateArr;
        }
    }
};
</script>

<style lang="scss">
// 解决picker的快捷方式为12个月的时候,后面两个月在面板上面看不到的问题
.kingChangePickPanelPaBo {
    .el-picker-panel__body-wrapper {
        .el-picker-panel__sidebar {
            padding-bottom: 50px;
        }
    }
}
</style>
10 声望
0 粉丝
0 条评论
推荐阅读
vue电影座位选座,最简单的写法没有之一
废话不多说,直接上代码,由于代码比较简单,不多做解析 {代码...}

浪迹天涯小king阅读 338

封面图
「多图预警」完美实现一个@功能
一天产品大大向 boss 汇报完研发成果和产品业绩产出,若有所思的走出来,劲直向我走过来,嘴角微微上扬。产品大大:boss 对我们的研发成果挺满意的,balabala...(内心 OS:不听,讲重点)产品大大:咱们的客服 I...

wuwhs39阅读 4.7k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco19阅读 2k评论 2

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 1.9k

封面图
【已结束】SegmentFault 思否写作挑战赛!
SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等级,快来参与挑战,向更好的自己前进!

SegmentFault思否20阅读 5.6k评论 10

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 19.8k评论 9

你可能不需要JS!CSS实现一个计时器
CSS现在可不仅仅只是改一个颜色这么简单,还可以做很多交互,比如做一个功能齐全的计时器?样式上并不复杂,主要是几个交互的地方数字时钟的变化开始、暂停操作重置操作如何仅使用 CSS 来实现这样的功能呢?一起...

XboxYan20阅读 1.5k评论 1

封面图
10 声望
0 粉丝
宣传栏