vue - vue中对Vant日历组件(calendar)的二次封装

本文详细描述了如何在Vue项目中对vant的日期选择器组件进行二次封装,包括日期区间选择、自定义底部按钮、清除时间功能、默认选中日期范围设定、组件宽度控制以及接口交互等特性。

vue中对vant日历选择器组件实现的的二次封装;主要实现功能如下:

主要功能:

日期区间选择(基本);
自定义选择器的底部按钮,添加清除时间操作(slot插槽);
指定默认选中的日期范围(当前日期到本月底通过default-date)
自定义日期可选范围;(通过 min-date 和 max-date )
支持默认值的传入;(没有默认值时会显示placeholder:请选择时间区间)
自定义组件的宽度;(通过props:Width,推荐使用百分比 如:80%)
效果图如下:

日期区间组件实现如下:calendar.vue

主要代码讲解:

1, 通过<template slot="footer">可以更改底部默认的按钮,我这边添加来了一个清除时间的按钮;点击清除时间按钮会把时间清空,恢复到默认状态;
2,通过min-date 和 max-date控制日期可以选择的开始和结束的范围;
3,通过default-date可以更改指定默认选中的日期范围,需要注意的是返回的是一个数组,开始位置和结束位置;可以看一下timeInterval()方法;
4,点击确认按钮onConfirmAll()会把所选择开始日期和结束日期返回给父组件;时间格式如下:2023-02-20;
5,可以传入defaultData 默认值,没有默认值会显示: 请选择时间区间;
6,可以传入:Width="'100%'" 来控制组件的宽度;
7,针对不同的业务需求可以对当前组件做出相应的调整;


                
### Vant UI Calendar 组件使用方法 在 Vue 项目中集成并使用 Vant 的 `Calendar` 组件可以方便地实现日期选择功能。为了更好地理解如何封装此组件,以下是详细的说明。 #### 安装依赖 首先,在项目根目录下通过 npm 或 yarn 安装 Vant: ```bash npm install vant --save ``` 或者 ```bash yarn add vant ``` 接着引入所需样式文件以及组件本身[^1]。 #### 基础配置与导入 创建一个新的 Vue 文件来定义自定义的日历组件,比如命名为 `CustomCalendar.vue`: ```javascript // CustomCalendar.vue <template> <van-calendar v-model="show" @confirm="onConfirm"/> </template> <script> import { Calendar } from 'vant'; export default { components: { VanCalendar: Calendar, }, data() { return { show: false, // 控制弹窗显示状态 }; }, methods: { onConfirm(date) { this.show = false; console.log('Selected date:', date); } } }; </script> <style lang="less"> @import '~vant/lib/index.css'; /* 引入 Vant 样式 */ </style> ``` 上述代码展示了最简单的日历组件初始化方式,并设置了确认事件处理器以便获取选定的日期。 #### 进一步优化 - 封装成可重用模块 为了让这个组件更加灵活易用,可以通过 props 和 events 来增强其交互能力。修改后的版本如下所示: ```html <!-- CustomCalendar.vue --> <template> <div class="custom-calendar-wrapper"> <button type="button" @click="toggleShow">{{ buttonText }}</button> <!-- 日历控件 --> <transition name="fade"> <van-calendar v-if="visible" :min-date="minDate" :max-date="maxDate" color="#ff4d4f" @select="handleSelect" @close="hideCalendar" /> </transition> </div> </template> <script> import dayjs from 'dayjs'; const today = new Date(); const oneYearAgo = new Date(today.getFullYear()-1,today.getMonth(),today.getDate()); export default { props: ['value'], computed:{ visible(){ return this.value || false; }, minDate(){return oneYearAgo}, maxDate(){return today} }, watch: { value(newValue){ newValue ? this.$emit('input', true):this.hideCalendar() } }, mounted(){ document.addEventListener('click',(event)=>{ const el=event.target.closest('.custom-calendar-wrapper'); !el && this.visible&&this.hideCalendar(); }); }, beforeDestroy(){ document.removeEventListener('click') }, methods: { toggleShow() { this.$emit('input',!this.visible ); }, handleSelect(selectedDates) { let selectedDay=selectedDates[0]; this.$emit('change', selectedDay.format('YYYY-MM-DD')); this.toggleShow(); }, hideCalendar(){ this.$emit('input',false ) } } }; </script> <style scoped> .custom-calendar-wrapper button{ padding:.5em .8em ; border:none; background-color:#fff; cursor:pointer; } .fade-enter-active,.fade-leave-active{ transition: opacity .3s;} .fade-enter,.fade-leave-to{/* .fade-leave-active below version 2.1.8 */opacity: 0;} .van-overlay{z-index:999!important;}/* 提升遮罩层优先级 */ @media (min-width:768px){.van-popup--bottom{width:40%;}} </style> ``` 这段改进过的代码实现了更丰富的用户体验,包括但不限于按钮触发器、范围限定、颜色主题定制等功能特性。 #### 实际应用案例 假设在一个表单页面中有这样一个需求——允许用户点击输入框打开日历选择具体某一天作为结束时间,则可以在父组件里这样调用刚刚封装好的 `CustomCalendar` : ```html <form action="#"> ... <label>End Time:</label> <input readonly placeholder="Please select end time..." :value="endTimeStr"> <!-- 自定义日历组件 --> <custom-calendar v-model="isDatePickerVisible" @change="(dateString)=>updateEndTime(dateString)" ></custom-calendar> ... </form> ``` 其中 `endTimeStr`, `isDatePickerVisible` 是由父组件管理的状态变量;而 `updateEndTime()` 方法则负责处理来自子组件的选择结果更新逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嫣嫣细语

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

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

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

打赏作者

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

抵扣说明:

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

余额充值