史上最全vue + Element日期选择器 案例超详细哦

给大家分享下我最近项目遇到的问题,总结了下我遇到的问题,希望对大家有些帮助。先说说我要做的日期选择器的需求

1.范围选择,开始时间,结束时间
2.结束时间到开始时间不得大于90天

所以我首先想到的是日期范围选择器


  
    
        
     * 最长90天
  

如果是必填项
别忘了在rules里面增加验证(记得在el-form-item上加上prop绑定才会生效)

                termOfValidity: [
                    { required: true, message: '请选择时间', trigger: 'change' }
                ],

大致样式就是这样


实现这些功能最好的方法就是禁用,把不符合条件的日期禁止用户去点击,引导用户,也防止用户乱点出问题
所以第一步:把当天之前的日期禁用掉(因为我要做的功能是设置活动时间范围,所以不能选择当日之前的日期)
需要通过这个来设置:picker-options="expireTimeOption"



这个要写在return里面


由于选完开始时间后,我才可以获取到90天以后的日期,所以这里需要用onPick拿到我选择的开始时间



所以我设置了两个变量来存储选中日期的值,记得在return里面初始化一下


expireTimeOption: {
    onPick: ({maxDate,minDate}) => {
        this.minDate=minDate;
        this.maxDate=maxDate;
    },
    // 禁用当前日期之前的时间
    disabledDate: time => { //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
         if(this.minDate){//当选择了开始时间,则禁用当日之前的日期,和开始时间+90以后的日期
               return time.getTime() < Date.now()-24*60*60*1000 || time >new Date(this.minDate.getTime()+90*24*60*60*1000)
         }
         return time.getTime() < Date.now()-24*60*60*1000;
   },             
},

还需要做一个容错如果日期被清空了的话,需要重设下禁用条件 @change="selectRangeTime"

selectRangeTime(e){
    // 如果时间被清空了,重置限定条件
    if(e === null){
        this.minDate = '';
        this.maxDate = '';
        this.expireTimeOption={
             disabledDate: time => { //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
                if(this.minDate){
                   return time.getTime() < Date.now()-24*60*60*1000 || time > new Date(this.minDate.getTime()+90*24*60*60*1000)
                }
                return time.getTime() < Date.now()-24*60*60*1000;
              },
          }
    }
},

虽然代码不是很多,但是写的过程遇到的困难还真是不少,也尝试了很多方法,走了很多弯路。可惜,做好了后,我们经理就是不满意,说什么用户怎么知道第一个选的日期是开始时间,还有就是要是单改某个日期怎么办,用户怕不都是傻子吧,非要我分成两个日期选择器来写,what,改?头给拧掉


可惜躲得了初一,躲不过十五呀,天天讲我做的不合理,开始又没给设计稿


     
          
                
          
     
     --
     
          
                
          
    
    
          * 最长90天
    

大致样式就是这样



用的还是:picker-options="xxx",return里面别忘了加

pickerOptionsStart : this.beginDate(),//开始日期配置
pickerOptionsEnd : this.endDate(),//结束日期配置

这次方法统一写在methods里面

        // 开始日期配置
        beginDate() {
            return {
                disabledDate(time) {
                    if (this.addCouponForm.endTime) {
                        return time.getTime() > new Date(this.addCouponForm.endTime).getTime();
                    }else{//还没有选择结束时间的时候,让他只能选择今天之后的时间包括今天
                        return time.getTime() < Date.now() - 8.64e7;
                    } 
                }
            }
        },
        // 结束日期配置
        endDate() {
            return {
                disabledDate(time) {
                    if(this.addCouponForm.startTime){
                        return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000;//可以选择同一天
                    }

                }
            }
        },

需要加一些方法容错

      // 改变开始日期时
        changeStart(){
            // 当改变开始日期时,如果结束时间小于开始时间则清空结束日期
            if(this.addCouponForm.startTime > this.addCouponForm.endTime){
                this.addCouponForm.endTime='';
            }
        },
        //打开结束日期时
        focusEnd(){
            // 如果直接选择结束日期(此时还没选择开始日期)  则在这之前应该先禁用当天之前的日期
            this.pickerOptionsEnd={
                disabledDate: time => {
                    if(!this.addCouponForm.startTime){
                        return time.getTime() < Date.now() - 8.64e7;
                    }else{
                        return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000;
                    }
                     
                }
            }
        },
        //打开开始日期时
        focusStart: function (){
            // 再次点击开始时间时禁用当日之前的日期
            this.pickerOptionsStart={
                disabledDate: time => {
                     return time.getTime() < Date.now() - 8.64e7;
                }
            }
        },

至于判断开始时间和结束时间之间是否超过90天,我也想过用上面第一种方法把超过90天的日期给禁用,开始试了很多次也不生效,所以我直接在提交表单的时候做了个判断,我这个人比较较真,后来想想觉得方法没错但是不知道怎么就是实现不了所以又试了下
我是想在点击开始时间的时候,拿到开始时间日期,然后禁用结束时间里90天以后的日期,但是发现怎么都不生效,后来发现根本没执行这个方法(我打印的ccc是我选择开始日期后计算出来它90天之后的日期)



我点击的时候页面上并没有打印0000和5555也就是说并没有执行到这一步



试了几次大概明白了规律就是,在开始时间的操作里面无论是change还是focus都只能操作this.pickerOptionsStart(开始日期配置),同理结束时间也一样,所以我想到了在打开结束时间的时候禁用90天以后的日期就成功了,哈哈
// 打开结束时间
focusEnd(){
    console.log('focusEnd');
    // 如果直接选择结束日期(此时还没选择开始日期)  则在这之前应该先禁用当天之前的日期
    this.pickerOptionsEnd={
          disabledDate: time => {
              if(!this.addCouponForm.startTime){
                 return time.getTime() < Date.now() - 8.64e7;
              }else{//打开时候禁用90天以后的日期
                 return time.getTime() < new Date(this.addCouponForm.startTime).getTime() - 1*24*60*60*1000 || time >(new Date(this.addCouponForm.startTime).getTime()+90*24*60*60*1000);
              }       
          }
     }
},

写的不好的地方欢迎大家留言批评,我看到后也会尽快改正,谢谢!
其实改起来并不难,但是我可能就是比较排斥这种功能实现了才让说要那样写,所以改起来也多花了点时间。之前参考了很多大神给的例子,因为看的也比较多,现在就不一一找了,感谢!
也给正在找工作的前端朋友一些建议,尽量还是别找不带UI设计的公司,因为太麻烦了,很多任务分配给你的时候说什么看着做,样式不作要求,或者让你仿照着写,结果一模一样非说不满意,或者就是跟你讲你先做,做好了给我看看我再说怎么改,总之就是改来改去,加油!冲啊!

你可能感兴趣的:(史上最全vue + Element日期选择器 案例超详细哦)