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

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>

打印结果如下

相关推荐
云浪5 小时前
Go 并发实战:从零实现一个高并发安全的任务调度器
javascript·后端·go
OpsEye13 小时前
大模型账单对账难:不同厂商 Token 统计口径差异怎么处理
javascript·ai编程
全栈项目管理程序猿13 小时前
ArcGIS JS 基础教程(32):体元系列 - VoxelSlice 体元切片
前端·javascript
WJ.Polar15 小时前
Java封装、继承、多态
java·开发语言
摇滚侠15 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
流烟默15 小时前
SSE 实战:在 SpringBoot + Vue 项目中零依赖实现轻量级实时消息推送
vue.js·spring boot·后端·sse
weixin_3077791315 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
Hilaku15 小时前
AI 流式输出都用 SSE,什么时候必须换 WebSocket?
前端·javascript·程序员
奇牙coding16 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
爱读书的小胖16 小时前
Codewars:Rot13(C)解题分析
c语言·开发语言