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

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>

打印结果如下

相关推荐
2401_873479402 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
Mh2 小时前
鼠标跟随倾斜动效
前端·css·vue.js
我爱cope2 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python2 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
浪浪小洋3 小时前
c++ qt课设定制
开发语言·c++
charlie1145141913 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
故事和你913 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
幺风4 小时前
Claude Code 源码分析 — Tool/MCP/Skill 可扩展工具系统
前端·javascript·ai编程
程序猿编码4 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
ID_180079054735 小时前
淘宝 API 上货 / 商品搬家 业务场景实现 + JSON 返回示例
前端·javascript·json