element UI 时间选择器限制时间无效

时间选择器限制不起作用

今天做时间选择器选择时间限制的时候,明明限制了时间,但是选择器无效,后来发现是format的原因导致的。这边限制的是开始时间可结束时间都只能选择之前一个月的,并且开始时间不能大于结束时间,结束时间不能小于开始时间。

<template>
    <div>
        <el-date-picker
        v-model="value1"
        align="right"
        type="date"
        placeholder="开始时间"
        value-format="yyyy-MM-dd HH:mm:ss"
        :picker-options="pickerOptions">
        </el-date-picker>
        <el-date-picker
        v-model="value2"
        align="right"
        type="date"
        placeholder="结束时间"
        value-format="yyyy-MM-dd HH:mm:ss"
        :picker-options="pickerOptions1">
        </el-date-picker>
    </div>
</template>
data(){
            return{
                value1:"",
                value2:"",
                pickerOptions:{ // 限制开始时间
                    disabledDate:(time)=>{
                        var tod = new Date()
                        var year = tod.getFullYear()
                        var month = tod.getMonth() + 1
                        var day = tod.getDate()
                        if(this.value2 !==''&&this.value2!==null){
                            if(month>1){
                                let threeMonths = `${year}/${month - 1}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() > this.value2 || time.getTime() < new Date(threeMonths)
                                )
                            }else{
                                month = 12
                                let threeMonths = `${year - 1}/${month}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() > this.value2 || time.getTime() < new Date(threeMonths)
                                )
                            }
                        }else{
                            if(month>1){
                                let threeMonths = `${year}/${month - 1}/${day}`
                                return(
                                    time.getTime() > Date.now()|| time.getTime() < new Date(threeMonths)
                                )
                            }else{
                                month = 12
                                let threeMonths = `${year - 1}/${month}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() < new Date(threeMonths)
                                )
                            }
                        }
                    }
                },
                pickerOptions1:{ // 限制结束时间
                    disabledDate:(time)=>{
                        var tod = new Date()
                        var year = tod.getFullYear()
                        var month = tod.getMonth() + 1
                        var day = tod.getDate()
                        if(this.value2 !==''&&this.value2!==null){
                            if(month>1){
                                let threeMonths = `${year}/${month - 1}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() < this.value1 || time.getTime() < new Date(threeMonths)
                                )
                            }else{
                                month = 12
                                let threeMonths = `${year - 1}/${month}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() < this.value1 || time.getTime() < new Date(threeMonths)
                                )
                            }
                        }else{
                            if(month>1){
                                let threeMonths = `${year}/${month - 1}/${day}`
                                return(
                                    time.getTime() > Date.now()|| time.getTime() < new Date(threeMonths)
                                )
                            }else{
                                month = 12
                                let threeMonths = `${year - 1}/${month}/${day}`
                                return(
                                    time.getTime() > Date.now() || time.getTime() < new Date(threeMonths)
                                )
                            }
                        }
                    }
                }
            }
        }

实际测试是无效的,如下图:
在这里插入图片描述
按正常来讲应该是结束时间是不能选择2.16之前的,现在依然能选择,问题在于绑定的是value-format属性,这时候用来判断的时间是被格式化后的,2021-02-16 00:00:00,不再是之前的时间了,需要一层转换

time.getTime() < this.value1 // 换成  time.getTime() < new Date(this.value1).getTime() 
time.getTime() < new Date(this.value1).getTime() 

这样就可以了,因为时间格式没转换导致一直无效。

### 关于 Element UI 中日历组件实现年份选择功能 在 Element UI 或其升级版 Element Plus 中,标准的日历组件(`ElCalendar`)主要用于展示月份视图并支持日期的选择。然而,默认情况下并不提供直接的年份选择功能。为了实现这一需求,可以考虑以下两种方式: 1. **自定义扩展 `ElCalendar` 组件** 可通过修改组件的行为逻辑,在用户交互时切换至年份选择模式。这需要深入理解组件的工作机制,并利用 Vue 的生命周期钩子以及事件监听来完成。 2. **使用其他时间选择替代** 如果目标仅仅是让用户选择特定年份而非具体日期,推荐使用 `el-date-picker` 时间选择,并将其配置为仅显示年份选项。以下是具体的实现示例[^4]: ```html <template> <div> <!-- 使用 el-date-picker 实现年份选择 --> <el-date-picker v-model="selectedYear" type="year" placeholder="选择年份"> </el-date-picker> <!-- 显示所选年份 --> <p>已选择年份:{{ selectedYear | formatDate }}</p> </div> </template> <script> export default { data() { return { selectedYear: '' // 存储选定的年份 }; }, filters: { formatDate(value) { if (value) { return new Date(value).getFullYear(); } return ''; } } }; </script> ``` 上述代码片段展示了如何借助 `el-date-picker` 来实现单一的年份选择功能。通过设置 `type="year"` 参数,可以让控件专注于年份维度的操作。 --- ### 自定义 `ElCalendar` 添加年份选择能力 如果坚持要在 `ElCalendar` 上增加年份选择的支持,则需额外编写逻辑处理。例如,可以通过捕获用户的点击行为,动态调整日历的初始年份或跳转到指定年份页面。下面是一个简单的思路演示[^2]: #### HTML 部分 ```html <template> <div> <button @click="changeToYearMode">进入年份选择模式</button> <el-calendar :current-date="currentDate" ref="calendar"></el-calendar> </div> </template> ``` #### JavaScript 部分 ```javascript <script> export default { data() { return { currentDate: new Date(), // 初始日期 isYearSelecting: false, // 控制是否处于年份选择状态 }; }, methods: { changeToYearMode() { this.isYearSelecting = true; const year = prompt('请输入想要查看的年份:'); if (!isNaN(year)) { this.currentDate = new Date(parseInt(year), 0, 1); } else { alert('输入无效'); } } } }; </script> ``` 在此例子中,当按钮被按下后会提示用户手动输入期望浏览的目标年份,随后更新日历显示的内容。 --- ### 总结 虽然原生的 `ElCalendar` 不具备单独挑选某一年的能力,但可通过引入专门的时间选取工具或者改造现有插件达成目的。对于更复杂的场景建议优先选用官方文档里提到过的高级特性与第三方库相结合的方式解决实际开发中的难题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值