如何给vant的Calendar日历组件添加备注
时间:2022-09-16 10:16:24|栏目:vue|点击: 次
给vant的Calendar日历组件添加备注
先引入Calendar组件哦 可以查看vant官方 https://youzan.github.io/vant/#/zh-CN/calendar
最近做的一个项目有用到日历 需要自定义日期文案
poppable
设置为false,代表日历会直接平铺展示在页面中 ,不是以弹层的形式出现show-confirm
设置为false, 代表是不显示日历的确定按钮,用户点击任意日期就立即触发confirm事件min-date
最小日期段max-date
最大日期段formatter
自定义日期文案 我用来给每个日期添加备注className
额外类名
<!-- 日期表格 --> <van-calendar title="日历" :poppable="false" :show-confirm="false" :style="{ height: '10.666667rem' }" :min-date="minDate" :max-date="maxDate" @confirm="confirmFn" :formatter="formatter" :className="'van-calendar__top-info'" />
export default { name: 'DoctorData', data() { return { // 医生id doctorId: '', // 姓名信息 doctorInfo: {}, // 所点击的时间 timeValue: '', // 医生排班预约次数和day值 curNums: [], // 最小时间值 当前时间 minDate: new Date() } }, created() { // 接受上一层传来的数据 this.doctorId = this.$route.params.doctorId this.doctorInfo = this.$route.params.doctorInfo // 获取医生排版日期预约次数 this.getDoctorData() }, methods: { // 获取医生排版日期预约次数 async getDoctorData() { // 发送请求获取后台数据 const data = await this.$http.get(`doctorScheduleDataJson?id=${this.doctorId}&openId=123213`) if (data.status !== 200) { return this.$Toast.fail('获取医生排版预约次数失败') } // 取出剩余次数和day的值 let b = [] for (let a in data.data) { console.log(data.data[a].day) console.log(data.data[a].cur_num) b = { key: data.data[a].day, value: data.data[a].cur_num } this.curNums.push(b) } console.log(this.curNums); // 打印的格式 [0:{key:14,value:57},1:{key:15,value:57},2:{key:16,value:0}] }, // 日期添加备注 formatter(day) { // 当前月份的日 var date = day.date.getDate() for (let i = 0; i < this.curNums.length; i++) { // 当前点击的日相同 if (date == this.curNums[i].key) { // 判断预约次数是否为0 if (this.curNums[i].value == 0) { // 日期添加备注 day.topInfo = '已约满' } else { // 日期添加备注 day.topInfo = '可预约' } } } return day }, // 点击任意日期 confirmFn(data) { console.log(data); this.timeValue = this.timeFormat(data) for (let i = 0; i < this.curNums.length; i++) { // 如果当前点击的日 相同 if (this.timeValue == this.curNums[i].key) { // 当前日期的预约次数为0 提示用户并不可跳转 if (this.curNums[i].value == 0) { return this.$Toast.fail('当前日期已约满') } this.$router.push({ name: 'Registration', params: { data: data } }) } } }, // 时间格式化 2019-09-08 timeFormat(time) { let year = time.getFullYear() let month = time.getMonth() + 1 let day = time.getDate() return day }, }, computed: { // 最大日期为当前时间日期+预约时间段 maxDate() { let curDate = new Date().getTime() // 后台返回的预约天数(7) - 1 因为不减一 会多出一天 预约天数为7 页面会显示8天 let one = (this.doctorInfo.bookDayNum - 1) * 24 * 3600 * 1000 let oneYear = curDate + one return new Date(oneYear) } } }
<style lang="less" scoped> // 日历备注 .van-calendar__top-info { background: linear-gradient(86deg, rgba(212, 165, 116, 0.98), rgba(238, 202, 163, 0.98)); } </style>
效果图:
横向的vant组件的日历
vant的日历组建只支持纵向变化,不支持横向,就稍微改变了一下
<template> <div class="calendar-wrap" style="positon:relative"> <div class="month-year">{{showYear}}年{{showMonth+1}}月</div> <van-icon class="arrow" @click="deMonth" name="arrow" /> <van-icon class="arrow-left" @click="adMonth" name="arrow-left" /> <van-icon class="arrow-year" @click="deYear" name="arrow" /> <van-icon class="arrow-year-1" @click="deYear" name="arrow" /> <van-icon class="arrow-left-year-1" @click="adYear" name="arrow-left" /> <van-icon class="arrow-left-year" @click="adYear" name="arrow-left" /> <van-calendar class="calendar" ref="calendar" color="#399f0e" row-height="40" :min-date="minDate" :max-date="maxDate" :default-date="nowDay" :poppable="false" :show-subtitle="false" :show-title="false" :show-mark="false" :show-confirm="false" :formatter="formatterDay" @select="slecetDay" > <template #bottom-info="item" > <span class="mark-green" v-if="item.bottomInfo==1"></span> <span class="mark-red" v-if="item.bottomInfo==2"></span> </template> </van-calendar> </div> </template>
<script> export default { data(){ return{ minDate: new Date(), maxDate: new Date(), defaultDate: new Date(), monthCont: 0, yearCont:0, year: new Date().getFullYear(), month: new Date().getMonth(), nowDay:new Date(), showYear: new Date().getFullYear(), showMonth:new Date().getMonth(), } } watch:{ defaultDate(val) { this.setMinMaxDay(); } }, methods:{ formatterDay(day){ return day; }, slecetDay(day){ }, // 当前月上一个月 deMonth() { this.monthCont--; this.defaultDate = new Date( this.year, this.month + this.monthCont, 1 ); }, // 当前月下一个月 adMonth() { this.monthCont++; this.defaultDate = new Date( this.year, this.month + this.monthCont, 1 ); }, // 当前年上一个年 deYear() { this.yearCont--; this.defaultDate = new Date( this.year+ this.yearCont, this.month, 1 ); }, // 当前年下一个年 adYear() { this.yearCont++; this.defaultDate = new Date( this.year+ this.yearCont, this.month , 1 ); }, setMinMaxDay(){ this.showYear= this.defaultDate.getFullYear(); this.showMonth = this.defaultDate.getMonth(); var firstDay = new Date(this.defaultDate); firstDay.setDate(1) var endDay = new Date(this.showYear,this.showMonth+1,1); this.minDate =new Date( this.showYear, this.showMonth, firstDay.getDate() ) endDay.setDate(0) this.maxDate =new Date( this.showYear, this.showMonth, endDay.getDate() ) } } } </script>
<style scoped lang='scss'> .calendar-wrap::v-deep{ width: 100%; position: relative; .van-calendar__month-title{ display: none; } .mark-red{ display: block; width: 5px; height: 5px; background-color: #d46b08; border-radius: 50%; margin: 0 auto; } .mark-green{ display: block; width: 5px; height: 5px; background-color: #389e0d; border-radius: 50%; margin: 0 auto; } .month-year{ padding: 10px 0; text-align: center; font-size: 14px; } .arrow{ position: absolute; top: 15px; right: 10px; } .arrow-left{ position: absolute; top: 15px; left: 10px; } .arrow-year{ position: absolute; top: 15px; right: 30px; } .arrow-left-year{ position: absolute; top: 15px; left: 30px; } .arrow-year-1{ position: absolute; top: 15px; right: 35px; } .arrow-left-year-1{ position: absolute; top: 15px; left: 35px; } } </style>
vant icon没找到双箭头就用2个单箭头组合一下
栏 目:vue
本文地址:http://www.codeinn.net/misctech/213833.html