vue3+element ui +ts 封装周范围选择器

vue3+element ui +ts 封装周范围选择器

在业务场景中,产品需要在页面中使用周范围选择器,我们在使用ant-design的时候里面是有自带的,但是在emement中只有指定周的范围选择器:
这个是ant-design的周范围选择器这个是ant-design的周范围选择器
这个是element ui 的日期范围选择器,组件类型为type
这个是element ui 的日期范围选择器,组件类型为month

作为一个合格的开发,封装一个公用的可以满足产品需求的组件那还不是基本的嘛。
话不多说,直接上代码

<template>
  <div class="week-date-picker">
    <el-date-picker
      v-model="value1"
      type="week"
      format="YYYY 年 第 ww 周"
      placeholder="开始周"
      style="width: 180px"
    />-
    <el-date-picker
      v-model="value2"
      type="week"
      format="YYYY 年 第 ww 周"
      placeholder="结束周"
      style="width: 180px"
    />
    <span v-if="value1&&value2 && weekNum > 0 && props.showDetail" style="margin-left: 10px">
      {{ date1 }}{{ date2 }}, 共 {{ weekNum }}</span>
  </div>
</template>
<script lang="ts" setup>
import { watch } from 'vue'
import moment from 'moment'
const props = defineProps({
  showDetail: {
    type: Boolean,
    default: false
  }
})
const [value1, value2, date1, date2] = [ref<any>(''), ref<any>(''), ref(''), ref('')]
const emit = defineEmits(['change'])
const weekNum:any = computed(() => {
  if (value2.value && value1.value) {
    return Math.round((value2.value - value1.value) / (24 * 60 * 60 * 1000 * 7)) + 1
  } else {
    return 0
  }
})
watch(() => value1.value, (value) => {
  if (!value) { return }
  if (value > value2.value) { // 保证value2大于value1
    value2.value = ''
  }
  date1.value = moment(value.getTime()).format('YYYY-MM-DD')
  if (date1.value && date2.value) {
    emit('change', [date1.value, date2.value])
  }
})
watch(() => value2.value, (value) => {
  if (!value) { return }
  if (value < value1.value) { // 保证value2大于value1
    value1.value = ''
  }
  date2.value = moment(value.getTime() + 6 * 24 * 60 * 60 * 1000).format('YYYY-MM-DD')
  if (date1.value && date2.value) {
    emit('change', [date1.value, date2.value])
  }
})
defineExpose({
  dateObj: {
    value1, value2, date1, date2
  }
})
</script>
<style scoped lang="scss">
</style>

看效果图吧

在这里插入图片描述
美中不足的时,起始的周范围需要点击对应的输入框才出现,不能同时选择起始周,将就用吧。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值