VUE实现日期多选,采用vue-calendar-componen插件(改造之-可以多段禁用)

由于vue-calendar-componen插件虽然支持多选,但是无法实现多禁用,且样式有些许不适,咋直接把源码扒下来进行改造,在自己的项目里创建components组件,改造好直接项目使用就ok了!

原三个文件calendar.js/calendar.vue/index.js 全部直接copy下来,对calendar.vue文件的getList方法进行改造,关键字k.dayHide则刻意控制禁用的数据.

calendat.js文件未变
export default {
    // 当某月的天数
    getDaysInOneMonth(date) {
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const d = new Date(year, month, 0);
        return d.getDate();
    },
    // 向前空几个
    getMonthweek(date) {
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const dateFirstOne = new Date(year + '/' + month + '/1');
        return this.sundayStart ?
            dateFirstOne.getDay() == 0 ? 7 : dateFirstOne.getDay() :
            dateFirstOne.getDay() == 0 ? 6 : dateFirstOne.getDay() - 1;
    },
    /**
     * 获取当前日期上个月或者下个月
    */
    getOtherMonth(date, str = 'nextMonth') {
        const timeArray = this.dateFormat(date).split('/');
        const year = timeArray[0];
        const month = timeArray[1];
        const day = timeArray[2];
        let year2 = year;
        let month2;
        if (str === 'nextMonth') {
            month2 = parseInt(month) + 1;
            if (month2 == 13) {
                year2 = parseInt(year2) + 1;
                month2 = 1;
            }
        } else {
            month2 = parseInt(month) - 1;
            if (month2 == 0) {
                year2 = parseInt(year2) - 1;
                month2 = 12;
            }
        }
        let day2 = day;
        const days2 = new Date(year2, month2, 0).getDate();
        if (day2 > days2) {
            day2 = days2;
        }
        if (month2 < 10) {
            month2 = '0' + month2;
        }
        if (day2 < 10) {
            day2 = '0' + day2;
        }
        const t2 = year2 + '/' + month2 + '/' + day2;
        return new Date(t2);
    },
    // 上个月末尾的一些日期
    getLeftArr(date) {
        const arr = [];
        const leftNum = this.getMonthweek(date);
        const num = this.getDaysInOneMonth(this.getOtherMonth(date, 'preMonth')) - leftNum + 1;
        const preDate = this.getOtherMonth(date, 'preMonth');
        // 上个月多少开始
        for (let i = 0; i < leftNum; i++) {
            const nowTime = preDate.getFullYear() + '/' + (preDate.getMonth() + 1) + '/' + (num + i);
            arr.push({
                id: num + i,
                date: nowTime,
                isToday: false,
                otherMonth: 'preMonth',
            });
        }
        return arr;
    },
    // 下个月末尾的一些日期
    getRightArr(date) {
        const arr = [];
        const nextDate = this.getOtherMonth(date, 'nextMonth');
        const leftLength = this.getDaysInOneMonth(date) + this.getMonthweek(date);
        const _length = 7 - leftLength % 7;
        for (let i = 0; i < _length; i++) {
            const nowTime = nextDate.getFullYear() + '/' + (nextDate.getMonth() + 1) + '/' + (i + 1);
            arr.push({
                id: i + 1,
                date: nowTime,
                isToday: false,
                otherMonth: 'nextMonth',
            });
        }
        return arr;
    },
    // format日期
    dateFormat(date) {
        date = typeof date === 'string
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现这个功能,可以使用 Vant 4.x 中的 Cascader 级联择器组件。在 Cascader 中,可以通过配置 options 属性来设置级联数据源,然后通过配置 value 属性来获取用户择的数据。同时,Cascader 还提供了 slot 来自定义显示内容,可以根据自己的需求来进行定制。 对于多,可以使用 Vant 4.x 中的 Checkbox 复框组件。在 Cascader 中,可以通过配置 show-checkbox 属性来开启多模式,然后通过配置 checked-options 属性来获取用户择的数据。 下面是一个简单的示例代码: ```html <van-cascader :options="options" :value="value" :show-checkbox="true" :checked-options="checkedOptions" @change="handleChange" > <template #title="{option}"> <van-checkbox v-model="option.checked">{{ option.label }}</van-checkbox> </template> </van-cascader> ``` ```javascript export default { data() { return { options: [ { value: 'beijing', label: '北京', children: [ { value: 'haidian', label: '海淀区', }, { value: 'chaoyang', label: '朝阳区', }, ], }, { value: 'shanghai', label: '上海', children: [ { value: 'pudong', label: '浦东新区', }, { value: 'minhang', label: '闵行区', }, ], }, ], value: [], checkedOptions: [], }; }, methods: { handleChange(value, selectedOptions, checkedOptions) { this.value = value; this.checkedOptions = checkedOptions; }, }, }; ``` 在上面的代码中,我们通过配置 options 属性来设置级联数据源,通过配置 value 和 checkedOptions 属性来获取用户择的数据。同时,我们使用了 slot 来自定义级联择器的显示内容,将每个项的 label 和 checkbox 组合在一起。最后,我们监听了 Cascader 的 change 事件,在事件处理函数中更新 value 和 checkedOptions 的值。 希望这个示例代码能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值