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

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>

打印结果如下

相关推荐
切糕师学AI3 分钟前
Vue 中 keep-alive 组件的生命周期钩子
前端·vue.js·keep-alive·生命周期·activated·deactivated
superman超哥4 分钟前
错误处理与验证:Serde 中的类型安全与数据完整性
开发语言·rust·编程语言·rust编程·rust错误处理与验证·rust serde
夔曦9 分钟前
【python】月报考勤工时计算
开发语言·python
fl1768319 分钟前
基于python实现PDF批量加水印工具
开发语言·python·pdf
daols8820 分钟前
vue2 表格如何使用 vxe-table 带列头复制单元格内容同步到 excel 中
vue.js·excel·vxe-table
Eugene__Chen22 分钟前
Java的SPI机制(曼波版)
java·开发语言·python
晚霞的不甘26 分钟前
Flutter for OpenHarmony 布局核心:Row 与 Column 深度解析与实战
android·前端·javascript·flutter
cici1587430 分钟前
基于LSTM算法的MATLAB短期风速预测实现
开发语言·matlab
ethan.Yin36 分钟前
element-plus 二次封装遇到的一点疑惑
javascript·vue.js·ecmascript
Ulyanov44 分钟前
Impress.js 3D立方体旋转个人年终总结设计与实现
开发语言·前端·javascript·3d·gui开发