日历组件(el-calendar)禁用自定义日期范围

效果图:

项目要求:只能操作今日以及以前的日期

由于el-calendar组件未直接提供禁用属性和相关操作,所以实现起来稍微有点麻烦,通过阅读文档还好其提供了插槽(slot="dateCell"  slot-scope="{date, data}"),用气扩展可以实现想要的效果。

方案一:插槽中用el-button组件,借用其disable属性

代码实现(无需js操作)

      //vue模板
       <el-calendar class="calendar-style" v-model="rangeTime">
          <template slot="dateCell" slot-scope="{ date, data }">
            <el-button
              type="text"
              :disabled="date > new Date() ? true : false"
              >{{ data.day.split("-").slice(2).join("") }}</el-button
            >
          </template>
        </el-calendar>

       //样式(我这里按照ui图对日历每个小格的大小做了的调整)
        button {
          color: #666666;
        }
       //按钮大小需要调整成和日历点击小格子大小一样覆盖掉点击的小个子否则点击周围还会起点击作用
        button.is-disabled {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          color: #cccccc;
        }
        ::v-deep .el-calendar-day {
          padding: 0;
          height: 40px;
          width: 40px;
          line-height: 40px;
          text-align: center;
          border-radius: 50%;
        }

        ::v-deep .is-selected .el-calendar-day {
          button {
            color: #fff !important;
          }
          background-color: #2e77d9;
        }

方案二:禁用click操作,并用css样式修饰实现

代码实现(无需js操作)

        //vue模板
        <el-calendar
          class="calendar-style"
          v-model="rangeTime"
        >
          <template v-slot:dateCell="{ date }">
            //此处使用 @click.stop禁用点击操作
            <p
              v-if="date.getTime() > new Date().getTime() + 60 * 60 * 1000"
              class="disabled"
              @click.stop
            >
              {{ parseTime(date, "{d}") }}
            </p>
            <p class="notDisabled" v-else>{{ parseTime(date, "{d}") }}</p>
          </template>
        </el-calendar>
        //css样式
        ::v-deep .el-calendar-day {
          padding: 0;
          height: 40px;
          width: 40px;
          line-height: 40px;
          border-radius: 50%;
          p {
            margin: 0;
            padding: 0;
            width: 40px;
            height: 40px;
            min-width: 28px;
            line-height: 40px;
            text-align: center;
            color: #000;
            border-radius: 50%;
            font-size: 15px;
            // font-family: Barlow Condensed SemiBold;
            background-clip: content-box;
          }
           // 自定义禁用样式
          .disabled {
            cursor: not-allowed;
            color: #c0c4cc;
          }
        }
        ::v-deep .is-selected .el-calendar-day {
          p {
            background-color: #2e77d9;
            color: #fff;
          }
        }

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
el-calendar 是一个基于 Vue.js日历组件,它提供了丰富的配置选项,可以轻松地实现自定义日辰。以下是一些实现自定义日辰的方法: 1. 通过设置 slot el-calendar 组件为每个日期单元格提供了一个 slot,可以通过设置 slot 来自定义单元格的内容。下面是一个示例代码: ```html <el-calendar :range-start="start" :range-end="end" :first-day-of-week="1" @change="handleChange"> <template #date="{ date }"> <div class="custom-cell"> <span class="date">{{ date.date }}</span> <span class="solar-term">{{ date.solarTerm | default '无' }}</span> </div> </template> </el-calendar> ``` 在上面的代码中,我们通过设置名为 date 的 slot 来自定义日期单元格,其中 date 是一个对象,包含日期信息和农历信息。在 slot 内部,我们可以使用这些信息来渲染自定义内容。 2. 通过设置 dateCellRender 属性 el-calendar 组件还提供了一个 dateCellRender 属性,可以用于自定义日期单元格的渲染函数。下面是一个示例代码: ```html <el-calendar :range-start="start" :range-end="end" :first-day-of-week="1" :date-cell-render="renderCell" @change="handleChange"></el-calendar> ``` 在上面的代码中,我们将 dateCellRender 属性设置为一个函数 renderCell,该函数接受一个参数 date,表示当前日期的信息。在函数内部,我们可以根据需要渲染自定义内容,并返回一个 Vue 组件或者 HTML 字符串。 ```js methods: { renderCell(date) { return { template: ` <div class="custom-cell"> <span class="date">{{ date.date }}</span> <span class="solar-term">{{ date.solarTerm | default '无' }}</span> </div> ` }; }, //... } ``` 在上面的代码中,我们返回了一个包含自定义 HTML 的 Vue 组件,这个组件将会被渲染到日期单元格中。在组件内部,我们可以使用 date 参数来访问日期信息和农历信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值