Element UI日期选择器二次封装

Element UI日期选择器二次封装

针对element ui组件日期选择器进行二次封装,实现点击年月日可以自由切换日期范围。

在这里插入图片描述

<template>
  <div class="time-box">
    <el-radio-group
      v-model="radio"
      size="small"
      style="margin-right: 10px"
      @change="onChange"
    >
      <el-radio-button label="year"></el-radio-button>
      <el-radio-button label="month"></el-radio-button>
      <el-radio-button label="day"></el-radio-button>
    </el-radio-group>

    <div v-if="radio == 'year'" style="margin-right: 10px">
      <el-date-picker
        v-model="startYear"
        style="width:130px"
        type="year"
        value-format="yyyy"
        placeholder="选择开始年">
      </el-date-picker>
      <span style="margin: 10px"></span>
      <el-date-picker
        style="width:130px"
        v-model="endYear"
        type="year"
        value-format="yyyy"
        placeholder="选择结束年">
      </el-date-picker>
    </div>

    <el-date-picker
      v-else
      v-model="value"
      :type="pickerType"
      range-separator="至"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      :value-format="radio == 'month' ? 'yyyy-MM' : 'yyyy-MM-dd'"
      style="margin-right: 10px"
      :picker-options="pickerBeginOption"
    ></el-date-picker>

    <el-button icon="el-icon-search" type="primary" @click="search">
      搜索
    </el-button>
  </div>
</template>
<script>
import moment from 'moment'
export default {
  props: [
    'label',
    'num',
    'numColor',
    'numUnit',
    'num2',
    'num2Color',
    'num2Unit',
    'icon',
    'pickerBeginOption',
  ],
  data: function () {
    return {
      radio: 'day',
      value: [],
      pickerType: 'daterange',
      startYear:moment().add(-1, 'year').format('YYYY'),
      endYear:moment().format('YYYY'),
    }
  },
  mounted() {
    let start = moment().add(-6, 'day').format('YYYY-MM-DD')
    let end = moment().format('YYYY-MM-DD')
    this.value = [start, end]

    let params = {
      dateType: this.radio,
      startDate: start,
      endDate: end,
    }
    this.$emit('onMounted', params)
  },
  methods: {
    onChange(value) {
      if (value == 'day') {
        let start = moment().add(-6, 'day').format('YYYY-MM-DD')
        let end = moment().format('YYYY-MM-DD')
        this.value = [start, end]
        this.pickerType = 'daterange'
      } else if (value == 'month') {
        let start = moment().add(-1, 'month').format('YYYY-MM')
        let end = moment().format('YYYY-MM')
        this.value = [start, end]
        this.pickerType = 'monthrange'
      } else if(value == 'year') {
        let start = moment().add(-1, 'year').format('YYYY')
        let end = moment().format('YYYY')
        this.startYear = start
        this.endYear = end
      }
    },
    search() {
      let start, end
      let values = []

      if(this.radio == 'year') {
          if(!this.startYear || !this.endYear) {
            this.$message.error('请选择时间')
            return
          }
          if(parseInt(this.startYear) > parseInt(this.endYear)){
            this.$message.error('开始年不能大于结束年')
            return
          }
      } else if(!this.value) {
        this.$message.error('请选择时间')
        return
      }

      if(this.radio == 'year') {
        values = [`${this.startYear}-01-01`, `${this.endYear}-12-31`]
      } else {
        values = this.value
      }
      if (values && values.length > 1) {
        if (this.radio == 'month') {
          start = values[0] + '-01'
          end =
            values[1] + '-' + moment(values[1], 'YYYY-MM').daysInMonth()
        } else {
          start = values[0]
          end = values[1]
        }

        let params = {
          dateType: this.radio,
          startDate: start,
          endDate: end,
        }
        this.$emit('onSearch', params)
      }

    },
  },
}
</script>
<style lang="less" scoped>
.time-box {
  display: flex;
  flex-direction: row;
  margin: 10px 0;
  /deep/ .el-range-separator {
    margin-right: 5px;
  }
}
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值