改写element-ui中的日期组件

  如果你想实现一个自定义的日期组件规则如下:日期组件未点开前左右两边有前一天后一天控制箭头,且前一天后一天有数据时才显示箭头,没有数据时,快速切换箭头隐藏。当日期组件点开后,有数据的天为可点击状态,无数据的为不可点击状态。

  那么,我们可以在已有的element-ui日期组件的基础上去实现这个功能。

  如下是element-ui中给的例子,表示日历中时间大于当前时间的天数均为不可点击状态。即return true时为不可点击状态。

  

<el-date-picker
      v-model="value2"
      align="right"
      type="date"
      placeholder="选择日期"
      :picker-options="pickerOptions1">
</el-date-picker>

 export default {
    data() {
      return {
        pickerOptions1: {
          disabledDate(time) {
            return time.getTime() > Date.now();
                     }
                }
          }
    }
}

可做如下修改:

 <div class="date">
        <span class="el-icon-arrow-left arrow
" @click="forward" v-show="forwardShow"></span>
        <el-date-picker
          v-model="timevalue"
          value-format="yyyy-MM-dd"
          format="yyyy-MM-dd"
          type="date"
          :picker-options="pickerOptions1"
          @change="timeChange">
        </el-date-picker>
        <span class="el-icon-arrow-right arrow" @click="back" v-if="backShow"> 
       </span>
</div>
data() {
  //注意此处得用let that = this;然后再通过that.dataArr来访问存后台返回的数据的日期数组,因为如果通过this是访问不到这个数组变量的。 let that
= this; return { forwardShow: true, backShow: true, dataArr: [], pickerOptions1: { disabledDate(time) { var y = time.getFullYear(); var mo = time.getMonth(); var da = time.getDate(); var newTime = y + '-' + (mo + 1) + '-' + da; var flag = true; that.dataArr.forEach(function (element) { if (element === newTime) { flag = false; } }); return flag; } }, replaceShow: false, timevalue: '' }; }, // 获取当前时间 getCurrTime() { var now = new Date(); this.timevalue = now; }, // 日期选择时触发的change事件 timeChange() { // var y = this.timevalue.getFullYear(); // var mo = this.timevalue.getMonth(); // var da = this.timevalue.getDate(); // var newTime = y+"-"+(mo+1)+"-"+da; var timestamp = this.timevalue.getTime() - 86400000; this.isForward(timestamp); var tamp = this.timevalue.getTime() + 86400000; this.isBack(tamp); }, // 点击前一天日期箭头触发的事件 forward() { var timestamp = this.timevalue.getTime() - 86400000; var forwardTime = new Date(timestamp); this.timevalue = forwardTime; var tamp = timestamp - 86400000; this.isForward(tamp); }, // 点击后一天日期箭头触发的事件 back() { var timestamp = this.timevalue.getTime() + 86400000; var backTime = new Date(timestamp); this.timevalue = backTime; var tamp = timestamp + 86400000; this.isBack(tamp); }, // 判断前一天切换按钮是否隐藏 isForward(timestamp) { var forwardTime = new Date(timestamp); var y = forwardTime.getFullYear(); var mo = forwardTime.getMonth(); var da = forwardTime.getDate(); var newForward = y + '-' + (mo + 1) + '-' + da; var flag = true; this.dataArr.forEach(function (element) { if (element === newForward) { flag = false; } }); if (flag) { this.forwardShow = false; } else { this.forwardShow = true; } }, // 判断后一天切换按钮是否隐藏 isBack(tamp) { var backTime = new Date(tamp); var by = backTime.getFullYear(); var bmo = backTime.getMonth(); var bda = backTime.getDate(); var newBack = by + '-' + (bmo + 1) + '-' + bda; var flag = true; this.dataArr.forEach(function (element) { if (element === newBack) { flag = false; } }); if (flag) { this.backShow = false; } else { this.backShow = true; } },

最后,我们就可以实现需求中的效果了。

原文地址:https://www.cnblogs.com/chenbeibei520/p/8639102.html