[vue] element 周数选择器(区间)

HTML:

<el-date-picker
  ref="getStartWeek"
  @change="startWeekChange"
  v-model="startWeek"
  type="week"
  format="yyyy年-WW周"
  :picker-options="startPickerOptions"
  :placeholder="开始周"
  :clearable="false"
></el-date-picker>
<span>&nbsp;-&nbsp;</span>
<el-date-picker
  ref="getEndWeek"
  @change="endWeekChange"
  v-model="endWeek"
  type="week"
  format="yyyy年-WW周"
  :picker-options="pickerOptions"
  :placeholder="结束周"
  :clearable="false"
></el-date-picker>

js:

data() {
  return{
    startWeek: "",
    endWeek: "",
    startPickerOptions: {},
    pickerOptions: {},
    searchForm: {
      beginWeekIndex: 0, // 开始周   (int)
      endWeekIndex: 0, // 结束周   (int)
      beginDate: "", // 开始时间 (str)
      endDate: "", // 结束时间 (str)
    },
  }
},
watch: {
    // 开始时间   2019-01-01 之前的日期禁用 || 两周前的今天,往后的日期禁用
  endWeek(newV, oldV) {
    const _this = this;
    const weekDay = this.$moment(new Date()).weekday();
    this.startPickerOptions = {
      disabledDate(time) {
        return (
          time.getTime() < _this.$moment('Tue Jan 01 2019 00:00:00 GMT+0800 (中国标准时间)') ||
          time.getTime() > _this.$moment(new Date()).add(-7 - weekDay, "d")
        );
      },
      firstDayOfWeek: 1,
    };
  },
    // 结束时间   已选中的开始日期之前的日期禁用 || 两周前的今天,往后的日期禁用
  startWeek(newV, oldV) {
    const _this = this;
    const weekDay = this.$moment(new Date()).weekday();
    this.pickerOptions = {
      disabledDate(time) {
        return (
          time.getTime() < _this.$moment(newV) ||
          time.getTime() > _this.$moment(new Date()).add(-7 - weekDay, "d")
        );
      },
      firstDayOfWeek: 1,
    };
  },
},
methods: {
    // 开始周
  startWeekChange() {
    var d =this.disposeWeek(new Date(this.startWeek));
    this.searchForm.beginWeekIndex = this.$refs.getStartWeek.displayValue.slice(6, 8) * 1;
    this.searchForm.beginDate = 
        d.getFullYear() + '-' + 
        (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1);
    // console.log(beginWeekIndex)   ====>   选中的当前周(今年的第几周 int 类型)
    // console.log(beginDate)        ====>   当前选中的周是哪年哪月的(如:2022-06)    
  },
    // 结束周
  endWeekChange() {
    var d = this.disposeWeek(new Date(this.endWeek));
    this.searchForm.endWeekIndex = this.$refs.getEndWeek.displayValue.slice(6, 8) * 1;
    this.searchForm.endDate = 
        d.getFullYear() + '-' + 
        (d.getMonth() + 1 < 10 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1);
    },

    // element的选择器是将当日的周数(周几)进行的取值
    //(比如今天周三,选中的那一周是根据周三来定的年月日)
    // 每周一为 年份/月份的起始
  disposeWeek(date){
        // 这里的判断是因为2019-01-01是在周二,周一为 2018-12-31
        // 但库里没有 19年1月之前的数据所以 这里检测到为19年第一周时,不继续接下来的方法
    if(date.getFullYear() === 2019 && date.getMonth() + 1 === 1){
      return new Date('2019-01-01');    
    };
    var Time = date.getTime();
    var day = date.getDay();
    var oneDayTime = 24*60*60*1000;
    var MondayTime = Time - (day - 1) * oneDayTime;
    return new Date(MondayTime);
  },
}

这里展示效果 

 这里是有默认值的。默认值的函数如下

created() {
  //当前周几
  const weekDay = this.$moment(new Date()).weekday();
  //冻结截止的日期
  const endDay = this.$moment(new Date())
    .add(-7 - weekDay, "d")
    .format("YYYY-MM-DD");
  //选择开始时间的日期
  const startDay = this.$moment(new Date())
    .add(-3, "M")
    .format("YYYY-MM-DD");
  //冻结截止的日期的时间戳
  const endLongTime = this.$moment(new Date()).add(-7 - weekDay, "d");
  //用于绑定截止日期datePicker
  this.endWeek = this.$moment(new Date()).add(-7 - weekDay, "d");
  //默认选择3个月的数据
  this.startWeek = this.$moment(new Date()).add(-3, "M");
  //开始时间的周
  this.searchForm.beginWeekIndex = this.getWeek(startDay);
  //结束时间的周
  this.searchForm.endWeekIndex = this.getWeek(endDay);
  //结束时间的年月
  this.searchForm.endDate = this.$moment(endDay).format("YYYY-MM");
  //开始时间的年月
  this.searchForm.beginDate = this.$moment(startDay).format("YYYY-MM");
},
methods: {
  /**
   * @function
   * @description
   * 获取默认周数
  */
  getWeek(endDate) {
    endDate = new Date(endDate);
    //本年的第一天
    var beginDate = new Date(endDate.getFullYear(), 0, 1);
    //星期从0-6,0代表星期天,6代表星期六
    var endWeek = endDate.getDay();
    if (endWeek == 0) endWeek = 7;
    var beginWeek = beginDate.getDay();
    if (beginWeek == 0) beginWeek = 7;
    //计算两个日期的天数差
    var millisDiff = endDate.getTime() - beginDate.getTime();
    var dayDiff = Math.floor(
      (millisDiff + (beginWeek - endWeek) * (24 * 60 * 60 * 1000)) / 86400000
    );
    return Math.ceil(dayDiff / 7);
  },
}

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值