element-plus日期选择器,月份与日期联动,非所选月的日期禁用 | 自定义日期格式化方法

文章描述了一个在Vue3环境中实现日期选择器的功能,包括监听日期变化,设置默认选中的日期(当前月的1号到今天),以及禁用特定日期(如当前月之后的日期和非当前月)。当选择其他月份时,日期会默认为所选月份的1号到月末,且非所选月份的日期被禁用。代码示例展示了如何使用`el-date-picker`组件,以及定义`getDisabledMonth`和`getDisabledDate`函数来控制禁用的日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

主要功能点:监听日期的变化,致默认选择日期以及禁用日期的范围变化,示例放在Vue3中

需求描述:

月份默认当前月,下月为禁用状态

日期默认当前月1号到今天,今日之后及非当前月的日期为禁用状态

 当月份选择其他月份时,日期默认值为这个月的1号到月末,非所选月的日期禁选

功能展示

当前月:

 

所选非当前月:

 

代码

<el-date-picker
   v-model="month"
   type="month"
   placeholder="请选择月份"
   value-format="YYYY-MM"
   :clearable="false"
   :editable="false"
   :disabled-date="getDisabledMonth"
 />
 <el-date-picker
   v-model="dateTime"
   type="daterange"
   range-separator="-"
   start-placeholder="起始时间"
   end-placeholder="结束时间"
   value-format="YYYY-MM-DD"
   :clearable="false"
   :editable="false"
   :disabled-date="getDisabledDate"
  />
<script setup>
  import { standardTime } from '@/utils/common'

  const month = ref(standardTime(new Date(), 'yyyy-MM'))

  // 禁选月份/日期
  const getDisabledMonth = (time) => {
    return time.getTime() > Date.now()
  }
  const getDisabledDate = (time) => {
    return (
      time.getTime() > Date.now() ||
      time.getTime() < new Date(getDateRange(month.value)[0].replace(/-/g, '/')).getTime() ||
      time.getTime() > new Date(getDateRange(month.value)[1].replace(/-/g, '/')).getTime()
    )
  }

  // 获取默认 起始时间-结束时间(当月1号-当天,不是当月1号到月末)
  // month:yyyy-MM
  function getDateRange(month) {
    const date1 = new Date(month) //将传入的时间字符串转换成时间对象
    const date2 = new Date() //当前时间
    const dateRange = []
    // console.log('月份---', standardTime(date1, 'yyyy-MM'), '|', standardTime(date2, 'yyyy-MM'))
    // console.log('1号', standardTime(date1, 'yyyy-MM') + '-01')
    // console.log('最后一日', standardTime(new Date(date1.getFullYear(), date1.getMonth() + 1, 0)))
    // 所选月份1号
    dateRange.push(standardTime(date1, 'yyyy-MM') + '-01')
    if (standardTime(date1, 'yyyy-MM') === standardTime(date2, 'yyyy-MM')) {
      // 如果当月就当天
      dateRange.push(standardTime(new Date(), 'yyyy-MM-dd'))
    } else {
      // 不是当月就最后一天
      dateRange.push(standardTime(new Date(date1.getFullYear(), date1.getMonth() + 1, 0)))
    }
    return dateRange
  }
  watch(
    month,
    () => {
      dateTime.value = getDateRange(month.value)
    },
    { immediate: true }
  )
</script>

  自定义日期格式化方法

自己写的日期格式化方法,其中flag参数可传‘start’、'end'或不传,已方便得到需要的时分秒格式

common.js

/**
 * 中国标准时间转年月日 Thu Mar 12 2020 00:00:00 GMT+0800 (中国标准时间) yyyy-MM-dd
 * flag:start:00:00:00|end:23:59:59|默认时间
 */
export function standardTime(time, type = 'yyyy-MM-dd', flag) {
  if (!time) {
    return
  }
  const d = new Date(time)
  const count = function (num) {
    // 补零
    if (num >= 10) {
      return num
    }
    return `0${num}`
  }

  let datetime = ''
  if (type === 'yyyy-MM-dd') {
    datetime = d.getFullYear() + '-' + count(d.getMonth() + 1) + '-' + count(d.getDate())
  } else if (type === 'yyyy-MM-dd HH:mm:ss') {
    if (flag === 'start') {
      datetime = d.getFullYear() + '-' + count(d.getMonth() + 1) + '-' + count(d.getDate()) + ' 00:00:00'
    } else if (flag === 'end') {
      datetime = d.getFullYear() + '-' + count(d.getMonth() + 1) + '-' + count(d.getDate()) + ' 23:59:59'
    } else {
      // 日期自身带有时分秒
      datetime =
        d.getFullYear() +
        '-' +
        count(d.getMonth() + 1) +
        '-' +
        count(d.getDate()) +
        ' ' +
        count(d.getHours()) +
        ':' +
        count(d.getMinutes()) +
        ':' +
        count(d.getSeconds())
    }
  } else if (type === 'yyyy-MM') {
    datetime = d.getFullYear() + '-' + count(d.getMonth() + 1)
  }
  return datetime || ''
}

### Element-Plus 日期选择器自定义月份内容 在 `Element-Plus` 中,可以通过插槽 (Slot) 或者事件机制来自定义组件的行为和外观。对于日期选择器 (`el-date-picker`) 的月份部分,可以利用其内置的插槽功能来实现自定义显示效果。 以下是通过 VueElement-Plus 实现的一个示例: #### 示例代码 ```vue <template> <div> <!-- 使用 el-date-picker 组件 --> <el-date-picker v-model="dateValue" type="month" placeholder="请选择月份"> <!-- 插槽用于自定义月份面板的内容 --> <template #month-panel="{ month, year }"> <span>{{ getCustomMonthContent(month, year) }}</span> <!-- 调用方法生成自定义内容 --> </template> </el-date-picker> </div> </template> <script> export default { data() { return { dateValue: null // 双向绑定的日期值 }; }, methods: { /** * 获取自定义月份内容的方法 */ getCustomMonthContent(month, year) { const customTexts = [ '特别', '促销', '节日', '活动', '常规', '淡季', '旺季', '特殊' ]; return `${year} 年 ${customTexts[month - 1]} (${month})`; // 返回定制化文字[^1] } } }; </script> ``` 在这个例子中,我们使用了 `el-date-picker` 提供的 `type="month"` 属性以及 `#month-panel` 插槽。该插槽允许开发者覆盖默认的月份展示逻辑并提供自己的 HTML 结构或动态数据处理方式。 需要注意的是,在实际开发过程中可能还需要考虑样式调整等问题以确保最终呈现的效果满足设计需求。 #### 关于样式的补充说明 如果希望进一步修改视觉风格,则可通过 CSS 定义特定类名或者作用域内的样式规则来进行美化操作。例如设置字体大小、颜色等属性以便更好地融入整体界面布局之中[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值