封装日期选择器组件,带有上周,下周按钮

ui图

组件代码如下:

html 复制代码
<template>
  <div>
    <el-date-picker
      v-model="dateRange"
      type="daterange"
      align="right"
      size="mini"
      :editable="false"
      unlink-panels
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      value-format="yyyy-MM-dd"
      format="yyyy-MM-dd"
      @change="handleDateChange"
      :readonly="true"
    >
    </el-date-picker>
    <el-button-group>
      <el-button size="mini" @click="prevWeek" style="margin-right: 5px;">上一周</el-button>
      <el-button size="mini" @click="nextWeek">下一周</el-button>
    </el-button-group>
  </div>
</template>

<script>
export default {
  name: 'DateRangePicker',
  props: {
    value: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      dateRange: this.value.length ? [...this.value] : this.getDefaultWeekRange(),
    };
  },
  watch: {
    value(newVal) {
      if (newVal.length) {
        this.dateRange = [...newVal];
      }
    }
  },
  methods: {
    getDefaultWeekRange() {
      const end = new Date();
      const start = new Date();
      start.setTime(start.getTime() - 3600 * 1000 * 24 * 6);
      return [start, end];
    },
    handleDateChange(val) {
      if (val && val.length === 2) {
        const formattedVal = [
          this.formatDate(val[0]),
          this.formatDate(val[1])
        ];
        this.$emit('input', formattedVal);
        this.$emit('change', formattedVal);
      } else {
        this.$emit('input', val);
        this.$emit('change', val);
      }
    },
    formatDate(date) {
      if (!date) return '';
      const d = new Date(date);
      const year = d.getFullYear();
      const month = String(d.getMonth() + 1).padStart(2, '0');
      const day = String(d.getDate()).padStart(2, '0');
      return `${year}-${month}-${day}`;
    },
    prevWeek() {
      const [start, end] = this.dateRange;
      const newStart = new Date(start);
      const newEnd = new Date(end);
      newStart.setDate(newStart.getDate() - 7);
      newEnd.setDate(newEnd.getDate() - 7);
      this.dateRange = [newStart, newEnd];
      this.handleDateChange(this.dateRange);
    },
    nextWeek() {
      const [start, end] = this.dateRange;
      const newStart = new Date(start);
      const newEnd = new Date(end);
      newStart.setDate(newStart.getDate() + 7);
      newEnd.setDate(newEnd.getDate() + 7);
      this.dateRange = [newStart, newEnd];
      this.handleDateChange(this.dateRange);
    }
  }
};
</script>

<style scoped>
.date-range-picker {
  display: flex;
  align-items: center;
}
.el-button-group {
  margin-left: 10px;
}
</style>

如何调用组件

html 复制代码
<template>
  <date-range-picker v-model="dateRange" @change="handleDateChange" />
</template>

<script>
import DateRangePicker from '@/views/components/DateRangePicker.vue';

export default {
  components: { DateRangePicker },
  data() {
    return {
      dateRange: []
    };
  },
  methods: {
    handleDateChange(range) {
      console.log('日期范围变化:', range);
    }
  }
};
</script>

打印结果如下

相关推荐
Zz_waiting.3 小时前
案例开发 - 日程管理 - 第六期
前端·javascript·vue.js·路由·router
索迪迈科技3 小时前
C语言 memcpy 的使用
c语言·开发语言
yuyousheng3 小时前
C语言中sizeof和strlen的区别
c语言·开发语言·哈希算法
Simon_He3 小时前
vue-markdown-renderer:比 vercel streamdown 更低 CPU、更多节点支持、真正的流式渲染体验
前端·vue.js·markdown
机构师3 小时前
<uniapp><指针组件>基于uniapp,编写一个自定义箭头指针组件
javascript·uni-app·vue·html
小桥风满袖3 小时前
极简三分钟ES6 - 模块化
前端·javascript
Mr_sun.3 小时前
Day04_苍穹外卖——套餐管理(实战)
开发语言·python
南棱笑笑生3 小时前
20250910在荣品RD-RK3588-MID开发板的Android13系统下修改短按power按键的休眠/唤醒为关闭/打开背光
开发语言·python·rockchip
悠悠~飘4 小时前
php学习(第二天)
开发语言·学习·php