vue3+ts封装一个el-date-picker,type为daterange时,可选时间范围为一个月

需求:可选时间范围为一个月


    <el-date-picker v-model="startEnd" type="daterange" :popper-class="popperClass" :unlink-panels="props.unlinkPanels" :editable="props.editable" range-separator="~" :start-placeholder="props.placeholder[0]" :end-placeholder="props.placeholder[1]" :format="props.format" :value-format="props.valueFormat" :clearable="props.clearable" @change="dateChange" prefix-icon="prefix-icon-class" @calendar-change="calendarChange" @visible-change="visibleChange" :disabled-date="disabledFn" />
import dayjs from 'dayjs'
import $ from 'jquery'
import { computed, nextTick, ref, watch } from 'vue'
const emit = defineEmits(['update:modelValue', 'change'])
const props = defineProps({
    width: {
        // 宽度
        type: String,
        default: '140px',
    },
    isDisabled: {
        // 是否禁用
        type: Boolean,
        default: false,
    },
    modelValue: {
        // 绑定的开始结束日期值
        type: Array,
        default: () => ['', ''],
    },
    inputSize: {
        // size 大小
        type: String,
        default: '',
    },
    dateType: {
        // 组件类型
        type: String,
        default: 'date',
    },
    valueFormat: {
        // 格式
        type: String,
        default: 'YYYY-MM-DD',
    },
    format: {
        // 格式
        type: String,
        default: 'YYYY-MM-DD',
    },
    clearable: {
        // 是否可清除
        type: Boolean,
        default: false,
    },
    msg: {
        // 格式
        type: String,
        default: '',
    },
    placeholder: {
        type: Array,
        default: () => ['开始日期', '结束日期'],
    },
    disableDay: {
        // 可选时间范围
        type: Number,
        default: 30,
    },
    size: {
        type: String,
        default: '',
    },
    editable: {
        // 文本框可输入-嵌套入app时不弹出键盘
        type: Boolean,
        default: false,
    },
    unlinkPanels: {
        // 在范围选择器里取消两个日期面板之间的联动-嵌套入app时只展示左边面板
        type: Boolean,
        default: false,
    },
})

let startEnd = ref<any[]>(['', ''])
watch(
    () => props.modelValue,
    newValue => {
        startEnd.value = newValue
    },
    { immediate: true }
)

watch(
    () => props.size,
    () => {
        nextTick(() => {
            const keyNode = document.querySelector('.el-range__icon')
            let iNode = document.createElement('i')
            if (props.size === 'small') iNode.setAttribute('class', 'iconfont icon-Calendar font-11')
            else iNode.setAttribute('class', 'iconfont icon-Calendar')
            if (keyNode) keyNode.appendChild(iNode)
        })
    },
    { immediate: true }
)

function dateChange() {
    const value = [startEnd.value[0] || '', startEnd.value[1] || '']
    emit('update:modelValue', value)
    emit('change', value)
}
const startVal = ref(null)
const calendarChange = (e: any) => {
    if (e[0] && !e[1]) {
        startVal.value = e[0]
    }
}

const visibleChange = (e: any) => {
    if (e) {
        startVal.value = null
    }
    if (props.unlinkPanels) {
        // 嵌套入app时,左边面板下一个月,下一年样式事件
        $('.d-arrow-right').removeAttr('disabled')
        $('.arrow-right').removeAttr('disabled')
        $('.arrow-right').removeClass('is-disabled')
        $('.d-arrow-right').removeClass('is-disabled')
    }
}

const popperClass = computed(() => {
    return props.unlinkPanels ? 'unlinkDate' : ''
})

const disabledFn = (current: any) => {
    if (!startVal.value) return false
    let range = [dayjs(startVal.value).subtract(0, 'day'), dayjs(startVal.value).add(props.disableDay, 'day')]
    let cur = dayjs(current)
    return cur < range[0] || cur > range[1]
}
<style lang="scss" scoped>
.prefix-icon-class {
    display: none;
}

.d-flex {
    display: flex;
}

.ml-5 {
    margin-left: 5px;
}

.mr-5 {
    margin-right: 5px;
}

.font-14 {
    font-size: 14px;
}

.a-center {
    align-items: center;
}

.j-center {
    justify-content: center;
}

.flex-nowrap {
    flex-wrap: nowrap;
}

v-deep.el-dropdown {
    .el-button--medium {
        padding: 10px !important;
    }
}
</style>
<style lang="scss">
.unlinkDate {
    /* 设置整体日期面板的宽度 */
    .el-date-range-picker {
        width: 322px;
        /* 左边日期面板宽度 */
        .el-picker-panel__content {
            width: 63% !important;
        }
        /* 隐藏右边日期面板 */
        .el-date-range-picker__content.is-right {
            display: none;
        }
        /* 隐藏中间线段 */
        .el-date-range-picker__content.is-left {
            border-right: none;
        }
    }

    // .el-picker-panel__content
}
</style>

unlinkPanels为false的效果:

unlinkPanels为true的效果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出在Vue3+TS中使用el-date-picker组件来获取年月日的取值。在模板中,可以使用v-model指令将选择的日期绑定到相应的数据属性上。例如,可以使用value1、value2和value3来分别绑定年、月和日的取值。\[1\] 在方法中,可以使用getdatetime()方法来给value1、value2和value3赋值,将它们初始化为当前日期。\[3\] 另外,如果需要将时间控件的格式转换为特定的格式,可以使用format属性来指定日期的显示格式。例如,可以使用"yyyy年"来显示年份,"MM月"来显示月份,"dd日"来显示日期。\[1\] 如果需要获取完整的日期和时间,可以使用type属性设置为"datetime",并使用value-format属性来指定日期和时间的格式,例如"yyyy-MM-dd HH:mm"。\[2\] 总结起来,使用el-date-picker组件可以通过v-model指令和format属性来获取年月日的取值,使用type属性和value-format属性来获取完整的日期和时间的取值。 #### 引用[.reference_title] - *1* *3* [vue-element日期选择器(默认显示当前年月日,并且只能选择当前及当前之前的日期)](https://blog.csdn.net/m0_50899555/article/details/122962517)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [el-date-picker时间插件获取值格式问题](https://blog.csdn.net/u014572906/article/details/108003894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值