自定义 vant 的 van-calendar 日历控件

news2024/11/24 21:04:23

最近在做 vue 微信公众号项目, 有个自定义日历控件展示的需求,经过查阅资料,最终实现了如图所示效果,这里做了总结,需要的小伙伴可以参考一下:

HTML代码:

<template>
  <div class="pageContainer">
    <div class="vanCalendar">
      <div class="topTitle">
        <div class="topYear">{{ new Date().getFullYear() }}</div>
        {{ new Date().getMonth() + 1 }}月
      </div>
      <van-calendar
        ref="calendar"
        color="#1989fa"
        :formatter="formatter"
        :min-date="minDate"
        :max-date="maxDate"
        :show-title="false"
        :show-mark="false"
        :show-subtitle="false"
        :poppable="false"
        :show-confirm="false"
        @select="onCalendarSelect"
      />
    </div>
  </div>
</template>

JS代码: 

<script>
export default {
  data() {
    return {
      dateList: [],
      minDate: "",
      maxDate: "",
    };
  },
  created() {
    const currentDate = new Date();
    const year = currentDate.getFullYear();
    const month = currentDate.getMonth();
    this.minDate = new Date(year, month, 1);
    this.maxDate = new Date(year, month, this.getLastDayOfMonth());
    // 模拟异步请求
    setTimeout(() => {
      this.dateList = [
        { date: "2024/06/01", status: "0" },
        { date: "2024/06/02", status: "0" },
        { date: "2024/06/03", status: "1" },
        { date: "2024/06/04", status: "1" },
        { date: "2024/06/05", status: "2" },
        { date: "2024/06/06", status: "2" },
        { date: "2024/06/07", status: "2" },
        { date: "2024/06/08", status: "2" },
        { date: "2024/06/09", status: "2" },
        { date: "2024/06/10", status: "1" },
        { date: "2024/06/11", status: "1" },
        { date: "2024/06/12", status: "1" },
        { date: "2024/06/13", status: "1" },
        { date: "2024/06/14", status: "1" },
        { date: "2024/06/15", status: "0" },
        { date: "2024/06/16", status: "0" },
        { date: "2024/06/17", status: "1" },
        { date: "2024/06/18", status: "1" },
        { date: "2024/06/19", status: "1" },
        { date: "2024/06/20", status: "1" },
        { date: "2024/06/21", status: "1" },
        { date: "2024/06/22", status: "0" },
        { date: "2024/06/23", status: "0" },
        { date: "2024/06/24", status: "2" },
        { date: "2024/06/25", status: "2" },
        { date: "2024/06/26", status: "1" },
        { date: "2024/06/27", status: "1" },
        { date: "2024/06/28", status: "1" },
        { date: "2024/06/29", status: "0" },
        { date: "2024/06/30", status: "0" },
      ];
    });
  },
  methods: {
    // 自定义日期文案
    formatter(day) {
      let isHasData = 0;
      let dayTimestamp = this.formattedDateFunc(day.date);
      this.dateList.forEach((item) => {
        if (dayTimestamp == item.date) {
          isHasData = item.status;
        }
      });
      // status=1,日期下方添加黄点
      if (isHasData == 1) {
        day.className = "addOrangeDot";
      }
      // status=2,日期下方添加绿点
      if (isHasData == 2) {
        day.className = "addGreenDot";
      }
      // 当前选中的日期
      if (day.type == "selected") {
        if (isHasData == 1) {
          // 给选中的日期加上蓝色实心圆,且status=1,日期下方添加黄点
          day.className = "selectedDay addOrangeDot";
        }
        if (isHasData == 2) {
          // 给选中的日期加上蓝色实心圆,且status=2,日期下方添加绿点
          day.className = "selectedDay addGreenDot";
        }
      }
      // 当天日期
      if (dayTimestamp == this.formattedDateFunc()) {
        if (isHasData == 1) {
          // 给当天加上蓝色空心圆,且status=1,日期下方添加黄点
          day.className = "addOrangeDot calendarToday";
        }
        if (isHasData == 2) {
          // 给当天加上蓝色空心圆,且status=2,日期下方添加绿点
          day.className = "addGreenDot calendarToday";
        }
      }
      return day;
    },
    // 日期被选中时触发的方法
    onCalendarSelect(val) {
      this.$toast("当前选中日期:" + this.formattedDateFunc(val, "-"));
    },
    // 获取当月的最后一天
    getLastDayOfMonth() {
      const date = new Date();
      const year = date.getFullYear();
      const month = date.getMonth();
      const lastDay = new Date(year, month + 1, 0).getDate();
      return lastDay;
    },
    // 日期格式化
    formattedDateFunc(timestamp, type = "/") {
      const currentDate = timestamp ? new Date(timestamp) : new Date();
      const year = currentDate.getFullYear();
      let month = currentDate.getMonth() + 1;
      let day = currentDate.getDate();
      month = month < 10 ? `0${month}` : month;
      day = day < 10 ? `0${day}` : day;
      return `${year}${type}${month}${type}${day}`;
    },
  },
};
</script>

CSS代码: 


<style lang="scss" scoped>
.pageContainer {
  height: calc(100vh - 68px);
  background: #fff;
  font-size: 18px;
  overflow: auto;
  .vanCalendar {
    ::v-deep .van-calendar__month-title {
      display: none;
    }
    ::v-deep .van-calendar__header {
      box-shadow: none;
    }
    //有数据日期加点
    .addGreenDot,
    .addOrangeDot {
      position: relative;
    }
    // 绿点
    ::v-deep .addGreenDot::after {
      position: absolute;
      content: "";
      width: 6px;
      height: 6px;
      top: 56px;
      left: 25px;
      border-radius: 50%;
      background-color: rgb(34, 177, 76);
    }
    // 黄点
    ::v-deep .addOrangeDot::after {
      position: absolute;
      content: "";
      width: 6px;
      height: 6px;
      top: 56px;
      left: 25px;
      border-radius: 50%;
      background-color: #ff822c;
    }
    //当天日期
    ::v-deep .calendarToday {
      position: relative;
    }
    // 当天日期添加空心蓝色圆
    ::v-deep .calendarToday::before {
      width: 40px;
      height: 40px;
      line-height: 40px;
      position: absolute;
      top: 11px;
      left: 9px;
      content: "";
      text-align: center;
      font-size: 30px;
      border-radius: 50%;
      border: 2px solid rgb(25, 137, 250);
    }
    //选中的日期
    ::v-deep .selectedDay {
      position: relative;
    }
    ::v-deep .selectedDay::before {
      width: 40px;
      height: 40px;
      line-height: 40px;
      position: absolute;
      top: 12px;
      left: 8.6px;
      content: "";
      text-align: center;
      font-size: 30px;
      border-radius: 50%;
      border: none;
    }
    //选中的日期添加实心蓝色圆
    ::v-deep .van-calendar__selected-day {
      border-radius: 50%;
      background: #59afff;
      z-index: 2;
      position: absolute;
      border: none;
    }
    ::v-deep .van-calendar__selected-day::after {
      background-color: #fff !important;
    }
    ::v-deep .van-calendar__header-subtitle {
      display: none;
    }
    ::v-deep .van-calendar__selected-day {
      width: 40px;
      height: 40px;
    }
  }
  .topTitle {
    position: relative;
    padding: 10px;
    text-align: center;
    background: #fff;
    font-size: 24px;
    font-weight: bold;
  }
  .topYear {
    position: absolute;
    left: 0;
    font-weight: normal;
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv10(7):YOLOv10训练(以训练VOC数据集为例)

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据_yolov10 训练-CSDN博客 YOLOv10&#xff08;2&#xff09;&#xff1a;网络结构及其检测模型代码部分阅读_yolov10网络结构图-CSDN博客 YOLOv10&#xff08;4&#xff09;&#xff1a;损失&…

每日一题——Python实现蓝桥杯1. 坤坤的破译任务(举一反三+思想解读+逐步优化)三千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度&#xff1a; 空间复杂度&#xff1a; 我要更强 时间复杂度分析…

Flutter循序渐进==>与基金mysql数据库交互

导言 债基基金的注意事项&#xff0c;别看收益不高&#xff0c;注意事项可真不少。最近买了CS一支基金&#xff0c;三周时间就亏掉两三个点&#xff08;水平全网最差、赎回费和管理费全网最高&#xff09;。就是冲着它的历史成绩去的&#xff0c;突然发现已经换了基金经理&…

向日葵API集成服务:三大优势助力企业搭建专属远控方案

为了方便企业用户更加灵活的搭建满足各自需求的软件解决方案&#xff0c;降低开发和部署门槛&#xff0c;很多软件方案供应商提供了多样化的合作模式。 以贝锐向日葵远程控制为例&#xff0c;他们就向客户提供了基础的SaaS服务模式、私有化部署模式、SDK嵌入模式&#xff0c;以…

第二证券:近300亿资金抄底,低估值+高增长“错杀”股名单来了,仅11只

成绩表现优质公司或存在“错杀”的状况。 头部宽基ETF成交额继续放量&#xff0c;近300亿资金抄底 6月21日&#xff0c;上证指数跌破3000点后&#xff0c;商场谨慎情绪延伸&#xff0c;成交量继续走低&#xff0c;本周4个交易日均缺乏7000亿元。 关于3000点以下的地量行情&a…

推荐系统中冷启动环节的设计实现

目录 推荐系统中冷启动环节的设计实现 推荐系统中冷启动环节的设计实现 唐楠烊 [IT阅读排行榜](javascript:void(0)&#x1f609; 2024-06-28 07:15 北京 推荐系统中的冷启动分为物料冷启动和用户冷启动。用户冷启动主要是针对新用户&#xff0c;但有时候也用于低活用户拉活。…

CVPR24已开源:刷新监督学习SOTA,无监督多目标跟踪时代来临!

论文标题&#xff1a; Matching Anything by Segmenting Anything 论文作者&#xff1a; Siyuan Li, Lei Ke, Martin Danelljan, Luigi Piccinelli, Mattia Segu, Luc Van Gool, Fisher Yu 导读&#xff1a; 在计算机视觉的征途中&#xff0c;多目标跟踪&#xff08;MOT&…

武汉凯迪正大—漆包圆线软化击穿试验仪 漆包线检测仪器

产品功能 武汉凯迪正大电气有限公司生产KDZD-JC软化击穿试验仪用于检测3.00mm及以下漆包线在热状态下漆膜软化后的绝缘性能&#xff0c;根据设定的预热温度、试验时间、仪器自动完成对试样的预加热、加负荷、加试验电压&#xff0c;达到试验时间或试样被击穿时即卸负荷&#x…

您渴望提升交易技能吗?

您渴望提升交易技能吗&#xff1f;Eagle Trader就是您的理想选择&#xff01;我们精心设计了多样化的挑战&#xff0c;配备真实数据模拟交易环境&#xff0c;让您轻松精进交易技术。更有精选交易工具和卓越服务助您一臂之力&#xff0c;优化策略&#xff0c;洞察市场&#xff0…

锂电池的串并联特性

1节锂电池电芯的规格是10000mah&#xff0c;4v&#xff08;总能量10000*4&#xff09; 那么3节电芯串联电池的规格是10000mah&#xff0c;12v&#xff08;总能量10000*12&#xff09;注意&#xff0c;这里电池的规格不是30000mah 3节电芯并联的规格是30000mah&#xff0c;4v …

【数据采集】亮数据浏览器、亮网络解锁器实战指南

前言 继上次我们写了数据采集与AI分析&#xff0c;亮数据通义千问助力跨境电商前行的文章之后&#xff0c;好多小伙伴来后台留言&#xff0c;表示对亮数据的数据采集非常感兴趣&#xff0c;并且感觉用起来非常顺手&#xff0c;大大减少了小白用户获取数据的成本。 在这儿&…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

Debian linux忘记root密码如何重置

重启电脑, 到下图再按 e 键 在页面中可以看到有个ro的行&#xff0c;在ro行的尾部&#xff0c;添加 rw init/bin/bas 3. ctrl X 启动系统&#xff0c;最后会进入命令行模式 4. 重设root密码&#xff0c;输入命令 passwd root&#xff0c;按照提示输入新密码并确认 5. 重启系…

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

智能语音热水器:置入NRK3301离线语音识别ic 迈向智能家居新时代

一、热水器语音识别芯片开发背景 在科技的今天&#xff0c;人们对于生活品质的追求已不仅仅满足于基本的物质需求&#xff0c;更渴望通过智能技术让生活变得更加便捷、舒适。热水器作为家庭生活中不可或缺的一部分&#xff0c;其智能化转型势在必行。 在传统热水器使用中&#…

ProfibusDP主站转Modbus模块连接称重仪配置案例

在工业自动化领域&#xff0c;常常需要将不同协议的设备进行连接。比如&#xff0c;将ProfibusDP主站转Modbus模块&#xff08;XD-MDPBM20&#xff09;用于连接称重仪&#xff0c;可以实现不同设备之间的数据交换和通信。ProfibusDP主站转Modbus网关&#xff08;XD-MDPBM20&…

一站式AI服务平台:MaynorAI助您轻松驾驭人工智能

一站式AI服务平台&#xff1a;MaynorAI助您轻松驾驭人工智能 在当前的数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经成为推动各行各业创新发展的核心动力。为了更好地满足企业和个人用户对AI服务的需求&#xff0c;MaynorAI 作为一个领先的一站式调用国内…

万物皆可爬——亮数据代理IP+Python爬虫批量下载百度图片助力AI训练

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【导航大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

我用低代码平台自己搭建了一套MES应用系统,1天搞定!

MES系统是什么 MES系统是一套面向制造企业车间执行层的生产信息化管理系统。它能够为操作人员和管理人员提供计划的执行、跟踪以及所有资源&#xff08;包括人、设备、物料、客户需求等&#xff09;的当前状态。通过MES系统可以对从订单下达到产品完成的整个生产过程进行优化管…

2024年6月大众点评深圳餐饮店铺POI分析18万家

2024年6月大众点评深圳餐饮店铺POI共有178720家 店铺POI点位示例&#xff1a; 店铺id G9TSD2JvdLtA7fdm 店铺名称 江味龙虾馆(南山店) 十分制服务评分 8.8 十分制环境评分 8.8 十分制划算评分 8.6 人均价格 128 评价数量 12840 店铺地址 南山大道与桂庙路交叉口西北角…