如何给vant的Calendar日历组件添加备注

目录
  • 给vant的Calendar日历组件添加备注
  • 横向的vant组件的日历

给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个单箭头组合一下

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Vue2-Calendar改进的日历组件(含中文使用说明)

    一,前言 我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅-- 于是网上搜了好久找到了Vue2-Calendar,不用说,挺好用的,但是同时也发现这个组件有些问题,有些功能挺不符合我们的要求,于是着手改了一版 二,改进的功能 在Vue2-Calendar v2.2.4 版基础上作了优化. 1.改进原控件无法切换语言的BUG,支持 lang='zh-CN'和'en'. 2.日历面板增加

  • 使用Vant完成DatetimePicker 日期的选择器操作

    效果展示: 代码展示: <template> <div id="date_time_picker"> <van-button plain type="primary" @click="showPopFn()">点击选择日期</van-button> <van-field v-model="timeValue" placeholder="选择的日期结果"

  • vant时间控件使用方法详解

    本文实例为大家分享了vant时间控件的使用方法,供大家参考,具体内容如下 代码: <template> <div class="shoukuan"> <!-- 头部公共搜索框 --> <tabbar title="添加团队活动"></tabbar> <div class="con"> <van-cell-group> <van-field v-model=&

  • 如何给vant的Calendar日历组件添加备注

    目录 给vant的Calendar日历组件添加备注 横向的vant组件的日历 给vant的Calendar日历组件添加备注 先引入Calendar组件哦  可以查看vant官方 https://youzan.github.io/vant/#/zh-CN/calendar 最近做的一个项目有用到日历 需要自定义日期文案 poppable设置为false,代表日历会直接平铺展示在页面中 ,不是以弹层的形式出现 show-confirm设置为false, 代表是不显示日历的确定按钮,用户点击任意日期就

  • 微信小程序日历组件calendar详解及实例

    微信小程序日历组件calendar详解及实例 模版使用: src="../cal/calendar.wxml"> is="calendar" data="{{selected_value,days,month,years,lunar_years,lunar_month,lunar_days,selectDateType,l unar_selected_value}}"> JS代码使用: var Calendar = require('

  • 原生JS实现日历组件的示例代码

    想要实现的效果 点击日期选择框出现日历 有个日期控制栏帮助选择日期, 包括年.月.日的选择和今天 日历格子,初次点击日期选择框时显示此刻的日期,日历格子的日期应该包括这个月的所有天数,同时如果当月的1号不是周日,还应补全从周日到1号的天数.还要在这个月最后1号的后面补全到周六. 日期控制栏和日历格子的日期还有选择框里的日期的变化要是同步的. 实现思路 为了组件的可复用性,需要用面向对象的思想. 每个日历组件都是一个日历对象,主要包括日期选择框,日期控制显示栏,还有日历格子,为了保持日期控制显示栏

  • 从零写vue日历组件

    目录 1.前言 2.vue日历制作 2.1制作月份选择器 2.2制作日历 2.2.1获取当前月所要显示的日期 2.2.2给不同的日期添加不同的样式 2.3将月份选择器和日历组件组合使用 2.4编辑功能 1. 前言 最近做项目遇到一个需求,需要制作一个定制化的日历组件(项目使用的UI框架不能满足需求,算了,我直说了吧,ant design vue的日历组件是真的丑,所以就自己写了一个),如下图所示,需求大致如下:(2)日历可以按照月份进行上下月的切换.(2)按照月份展示周一到周日的排班信息.(3)

  • jQuery EasyUI API 中文文档 - Calendar日历使用

    用 $.fn.calendar.defaults 重写了 defaults. 用法 复制代码 代码如下: <div id="cc" style="width:180px;height:180px;"></div> 复制代码 代码如下: $('#cc').calendar({ width:600, height:600, current:new Date() }); 特性 名称 类型 说明 默认值 width number 日历组件的宽度. 1

  • Jquery Easyui日历组件Calender使用详解(23)

    本文实例为大家分享了Jquery Easyui日历组件的实现代码,供大家参考,具体内容如下 加载方式 Class加载 <div id="box" class="easyui-calendar" style="width:200px;height:200px;"></div> JS调用加载 <div id="box"></div> <script> $(function

  • javascript实现的淘宝旅行通用日历组件用法实例

    本文实例讲述了javascript实现的淘宝旅行通用日历组件用法.分享给大家供大家参考. 在线演示:http://demo.jb51.net/js/2015/trip-calendar/demo.html PS:下面的演示代码,需要用到 trip-calendar.js与trip-calendar.css文件.打包下载地址 具体如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8">

  • 微信小程序可滑动月日历组件使用详解

    微信小程序可滑动月日历组件 此日历可进行左右滑动,展示签到打卡信息,和大家分享一下. 如果样式变形,请检查是否有共用样式起冲突 展示一下效果图 在components组件文件夹下新建calendarMonth文件夹 直接上代码吧: index.wxml <!--components/calendar/index.wxml--> <view class='month'> <!-- <view class='arrow' bindtap='prevMonth'><

  • vue实现一个炫酷的日历组件

    公司业务新开了一个商家管理微信H5移动端项目,日历控件是商家管理员查看通过日程来筛选获取某日用户的订单等数据. 如图: 假设今天为2018-09-02 90天前: 90天后; 产品需求: 展示当前日期(服务器时间)前后90天,一共181天的日期. 日历可以左右滑动切换月份. 当月份的如果不在181天区间的,需要置灰并且不可点击. 点击日历绑定的节点的外部,关闭弹窗. 涉及内容: 获取服务器时间,渲染日历数据 vue-touch监听手势滑动事件 ios日期兼容处理 clickOutSide自定义指

随机推荐