微信小程序--创建一个日历组件

news2024/12/13 5:48:41

微信小程序–创建一个日历组件

  • 可以创建一个日历组件,来展示当前月份的日期,并支持切换月份的功能。
一、目录结构
/pages
  /calendar
    calendar.wxml
    calendar.scss
    calendar.js
    calendar.json

二、calendar.wxml
  <view class="calendar">
    <view class="header">
      <view bindtap="changeMonth" data-direction="prev">
        <van-icon name="arrow-left" />
      </view>
      <text>{{year}}年{{month}}月</text>
      <van-icon name="arrow" bindtap="changeMonth" data-direction="next" />
    </view>
    <view class="days">
      <view class="week">
        <text></text>
        <text></text>
        <text></text>
        <text></text>
        <text></text>
        <text></text>
        <text></text>
      </view>
      <view class="dates">
        <block wx:for="{{days}}" wx:key="index">
          <view class="date">{{item}}</view>
        </block>
      </view>
    </view>
  </view>
三、calendar.scss
.calendar {
  width: 100%;
  border-radius: 15rpx;
  background-color: #fff;
  padding: 20rpx;
}

.header {
  width: 100%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size:32rpx;
}

.days {
  margin-top: 20px;
}

.week {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 5px;
  text-align: center;
  margin-bottom: 20px;
}

.dates {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 10px 5px;
}

.date {
  width: 100%;
  height: 60px;
  text-align: center;
  padding: 10px;
  background-color: #f0f0f0;
  color: #000;
}
四、calendar.js
Page({
  data: {
    year: new Date().getFullYear(),
    month: new Date().getMonth() + 1,
    days: [],
  },
  
  onLoad() {
    this.loadCalendar();
  },

  loadCalendar() {
    const { year, month } = this.data;
    // 获取当月的第一天是星期几
    const firstDay = new Date(year, month - 1, 1).getDay();
    // 获取当月的天数
    const totalDays = new Date(year, month, 0).getDate();
    // 创建日期数组
    const days = [];
    // 填充空白日期
    for (let i = 0; i < firstDay; i++) {
      days.push('');
    }
    // 填充实际日期
    for (let i = 1; i <= totalDays; i++) {
      days.push(i);
    }
    
    this.setData({ days });
  },

  changeMonth(event) {
    const direction = event.currentTarget.dataset.direction;
    let { year, month } = this.data;
    
    if (direction === 'prev') {
      month--;
      if (month < 1) {
        month = 12;
        year--;
      }
    } else if (direction === 'next') {
      month++;
      if (month > 12) {
        month = 1;
        year++;
      }
    }
    
    this.setData({ year, month }, () => {
      this.loadCalendar();
    });
  }
});
五、效果图(样式可以按需更改)

在这里插入图片描述
在这里插入图片描述

六、padStart

padStart(2, '0') 是 JavaScript 字符串的方法,用于填充字符串的开头直到指定的长度。

使用了 padStart(2, '0') 来确保日期和月份都是两位数格式。

str.padStart(targetLength, padString);
  • targetLength 是目标字符串的最终长度。
  • padString 是用于填充的字符串(如果字符串长度不够,使用这个字符串填充,直到目标长度为止)。

padStart(2, '0') 中,意思是如果原字符串的长度小于 2,则用 '0' 在字符串的开头进行填充,直到字符串的长度为 2。

  • 案列:
'5'.padStart(2, '0');  // '05'
'12'.padStart(2, '0'); // '12'
'123'.padStart(5, '0'); // '00123'
七、实现高亮当前日期,给日期添加点击事件,并高亮显示
  • calendar.wxml
   <view class="dates">
        <block wx:for="{{days}}" wx:key="index">
          <view class="date {{item.isToday ? 'highlight-today' : ''}} {{isChooseDate==item.day ? 'choose-day' : ''}}" bindtap="showEventDetail" data-day="{{item}}">{{item.day}}</view>
        </block>
      </view>
  • calendar.js
 loadCalendar() {
    const {
      year,
      month
    } = this.data;
    // 获取当月的第一天是星期几
    const firstDay = new Date(year, month - 1, 1).getDay();
    // 获取当月的天数
    const totalDays = new Date(year, month, 0).getDate();
    // 获取今天的日期(用于高亮显示)
    const today = new Date();
    const todayDate = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, '0')}-${today.getDate().toString().padStart(2, '0')}`;

    // 创建日期数组
    const days = [];
    // 填充空白日期
    for (let i = 0; i < firstDay; i++) {
      days.push('');
    }
    // 填充实际日期
    for (let i = 1; i <= totalDays; i++) {
      const day = `${year}-${month.toString().padStart(2, '0')}-${i.toString().padStart(2, '0')}`;
      const isToday = day === todayDate;  // 如果是今天的日期,则标记为今天
      days.push({ day: i,isToday });
    }

    this.setData({
      days,
      selectedDate:this.data.selectedDate?this.data.selectedDate:todayDate
    });
  },

  changeMonth(event) {
    const direction = event.currentTarget.dataset.direction;
    let {
      year,
      month
    } = this.data;

    if (direction === 'prev') {
      month--;
      if (month < 1) {
        month = 12;
        year--;
      }
    } else if (direction === 'next') {
      month++;
      if (month > 12) {
        month = 1;
        year++;
      }
    }

    this.setData({
      year,
      month,
      isChooseDate:''
    }, () => {
      this.loadCalendar();
    });

  },

  // 显示事件详情
  showEventDetail(event) {
    const day = event.currentTarget.dataset.day.day;
    const selectedDate = `${this.data.year}-${this.data.month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
 
    this.setData({
      isChooseDate:day,
      selectedDate:selectedDate
    })

  },
  • calendar.scss
  .choose-day{
    border:1px solid  #65b778;
    color: #65b778;
    font-weight: bold;
    background-color: #fff;
  }
  .highlight-today{
    background-color: #65b778;
    color: #fff;
    font-weight: bold;
  }
  • 效果图

在这里插入图片描述

八、滑动切换日历月份

calendar.html

<view class="calendar"  bindtouchstart="touchStart"   bindtouchend="touchEnd"></view>

calendar.js

  data: {
    startX: 0, // 触摸起始位置
    startY: 0, // 触摸起始位置
    minSwipeDistance: 50 // 设置最小滑动距离,单位:px
  },
    
        // 触摸开始事件
  touchStart(e) {
    this.setData({
      startX: e.touches[0].clientX,
      startY: e.touches[0].clientY
    });
  },
  // 触摸结束事件
  touchEnd(e) {
    const endX = e.changedTouches[0].clientX;
    const endY = e.changedTouches[0].clientY;

    const dx = endX - this.data.startX; // 水平滑动距离
    const dy = endY - this.data.startY; // 垂直滑动距离

    // 判断是否为左右滑动(忽略上下滑动)
    if (Math.abs(dx) > Math.abs(dy)) {
      if (Math.abs(dx) >= this.data.minSwipeDistance) { // 只有当滑动距离超过阈值时才切换,防止误触
        if (dx > 0) {
          // 向右滑动,切换到上个月
          this.changeMonthBySwipe('prev');
        } else if (dx < 0) {
          // 向左滑动,切换到下个月
          this.changeMonthBySwipe('next');
        }
      }
    }
  },
  // 根据滑动方向切换月份
  changeMonthBySwipe(direction) {
    let {
      year,
      month
    } = this.data;

    if (direction === 'prev') {
      month--;
      if (month < 1) {
        month = 12;
        year--;
      }
    } else if (direction === 'next') {
      month++;
      if (month > 12) {
        month = 1;
        year++;
      }
    }

    this.setData({
      year,
      month,
      isChooseDate: ''
    }, () => {
      this.loadCalendar();
    });
  },
      

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

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

相关文章

鸿蒙ArkTS语言基础语法详解

文章目录 鸿蒙ArkTS语言基础语法详解一、引言二、ArkTS语言概述1. ArkTS语言特点2. TypeScript基础语法2.1 类型注解2.2 接口2.3 泛型2.4 类的继承2.5 类的访问修饰符 三、ArkTS的基本组成3.1 装饰器3.2 UI描述3.3 自定义组件3.4 系统组件3.5 属性方法和事件方法 四、自定义组件…

STM32 HAL库之SDIO例程 Micro SD卡 - 2

1、硬件图 2、示例代码 根据提示配置SDCLK为72/3 24MHz。 static void MX_SDIO_SD_Init(void) {/* USER CODE BEGIN SDIO_Init 0 */SD_InitTypeDef Init;Init.ClockEdge SDIO_CLOCK_EDGE_RISING;Init.ClockBypass SDIO_CLOCK_BYPASS_DISABLE;Init.ClockPo…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号&#xff1a;小白的大数据之旅 在小程序的开发过程中&#xff0c;插件作为扩展功能、提升效率的重要工具&#xff0c;扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块&#xff0c;还能优化开发流程&#xff0c;缩短项目周期。 …

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL开源项目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代&#xff0c;将自然语言查询转化为结构化查询语言&#xff08;SQL&#xff09;的能力变得日益重要。无论是小型创业…

Java面试之单例模式浅谈

单例模式是Java面试中常会问到的一个问题&#xff0c;众所周知&#xff0c;单例模式分为两大部分&#xff1a;饿汉模式和懒汉模式。但是&#xff0c;如果当面试官问道关于单例模式的话&#xff0c;如果你只答出这两种模式&#xff0c;且懒汉模式还是最基础最简陋版的话&#xf…

零距离对接Modnbus转Profinet网关连接伺服与PLC

本研究案例详细阐述了开疆智能Modbus转Profinet网关KJ-PNG-201在实现HD3-L系列通用伺服驱动器与PLC互联中的应用。所涉及的设备包括西门子S7-1200 PLC、Modbus转Profinet网关以及HD3-L系列通用伺服驱动器。通过网关转换MODBUS协议的伺服驱动器与PROFINET协议的PLC之间的通信&am…

集成方案 | Docusign + 泛微,实现全流程电子化签署!

本文将详细介绍 Docusign 与泛微的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在现代企业运营中&#xff0c;效率和合规性是至关重要的。泛微作为企业级办公自动化和流程管理的解决…

CTF-WEB: php-Session 文件利用 [第一届国城杯 n0ob_un4er 赛后学习笔记]

step 1 搭建容器 教程 A5rZ 题目 github.com Dockerfile 有点问题,手动修复一下 FROM php:7.2-apacheCOPY ./flag /root COPY ./readflag / COPY ./html/ /var/www/html/ COPY ./php.ini /usr/local/etc/php/php.ini COPY ./readflag /readsecretRUN chmod 755 /var/www…

融资融券哪家证券公司利率3.8%,融资融券交易流程科普

融资融券哪个券商合适主要考虑券商业务实力与佣金费率等相关因素。 业务方面&#xff0c;一些大型上市券商业务更加成熟。这些券商在融资融券市场中占据重要地位&#xff0c;资金充足&#xff0c;券源丰富&#xff0c;能够满足投资者多样化的投资需求。 融资融券的利率和佣金…

Java 使用 Redis 实现微博热搜功能

在社交平台上&#xff0c;热搜功能是一个非常重要的组成部分。它展示了当前最热门的话题&#xff0c;帮助用户迅速了解最受关注的事件。在微博等平台上&#xff0c;热搜榜单通常是实时变化的&#xff0c;可能会根据用户的互动数据&#xff08;如搜索频次、点赞量、评论数等&…

《庐山派从入门到...》IDE启动

《庐山派从入门到...》IDE启动 《庐山派从入门到...》IDE启动 IDE&#xff08;Integrated Development Environment&#xff09;&#xff0c;即集成开发环境&#xff0c;是一种软件应用程序&#xff0c;旨在为软件开发人员提供一个全面的工具集合&#xff0c;以便可以更高效地编…

打电话玩手机识别-支持YOLO,COCO,VOC格式的标记,超高识别率可检测到手持打电话, 非接触式打电话,玩手机自拍等

打电话玩手机识别-支持YOLO&#xff0c;COCO&#xff0c;VOC格式的标记&#xff0c;超高识别率可检测到手持打电话&#xff0c; 非接触式打电话&#xff0c;玩手机自拍等1275个图片。 手持打电话&#xff1a; 非接触打电话 玩手机 数据集下载 yolov11:https://download.csdn…

【智体OS】官方上新发布智体电视:基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视

【智体OS】官方上新发布智体电视&#xff1a;基于rtpc和rttouchpad实现智体电视的手机遥控-可安装任意PC应用用于智体电视 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;…

Flink+Paimon实时数据湖仓实践分享

随着 Paimon 近两年的推广普及&#xff0c;使用 FlinkPaimon 构建数据湖仓的实践也越来越多。在 Flink 实时数据开发中&#xff0c;对于依赖大量状态 state 的场景&#xff0c;如长周期的累加指标计算、回撤长历史数据并更新等&#xff0c;使用实时数仓作为中间存储来代替 Flin…

Stable Diffusion本地部署:从零开始的完整指南

1、引言 Stable Diffusion是计算机视觉领域的一个生成式大模型&#xff0c;能够进行文生图&#xff08;txt2img&#xff09;和图生图&#xff08;img2img&#xff09;等图像生成任务。它利用深度学习技术&#xff0c;特别是RealisticVision v2.0模型&#xff0c;能够创造出接近…

鸿蒙元服务上架

鸿蒙元服务上架 一、将代码打包成 .app 文件1. 基本需求2. 生成密钥和证书请求文件3. 申请发布证书4. 申请发布Profile5. 配置签名信息6. 更新公钥指纹7. 打包项目成 .app 文件 二、发布元服务1. 进入应用信息页面2. 上传软件包3. 配置隐私协议4. 配置版本信息5. 提交审核&…

【论文阅读】PRIS: Practical robust invertible network for image steganography

内容简介 论文标题&#xff1a;PRIS: Practical robust invertible network for image steganography 作者&#xff1a;Hang Yang, Yitian Xu∗, Xuhua Liu∗, Xiaodong Ma∗ 发表时间&#xff1a;2024年4月11日 Engineering Applications of Artificial Intelligence 关键…

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…

特征交叉-CAN学习笔记代码解读

一 核心模块coaction 对于每个特征对(feature_pairs)weight, bias 来自于P_inductionP_fead是MLP的input 举个例子&#xff1a;如果是用户ID和产品ID的co-action&#xff0c;且产品ID是做induction&#xff0c;用户ID是做feed。 step1 用户ID/产品ID都先形成一个向量&#xf…

EfficientNet与复合缩放理论(Compound Scaling Theory) 详解(MATLAB)

1.EfficientNet网络与模型复合缩放 1.1 EfficientNet网络简介 1.1.1 提出背景、动机与过程 EfficientNet是一种高效的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;由Google的研究团队Tan等人在2019年提出。EfficientNet的设计目标是提高网络的性能&#xff0c;同时减…