微信小程序实现日历功能、日历转换插件、calendar_微信小程序日历-程序员宅基地

技术标签: web前端  微信小程序  web  JavaScript  前端  小程序  javascript  

文章目录


演示

效果图

calendar


微信小程序实现交互

X2_2_2_25


html

<view wx:if="{
     {calendarArr.length}}">
  <view class="height_786 df_fdc_aic">
    <view class="grid_c7_104">
      <view class="font_weight_800 text_align_center {
     {index===0||index===week.length-1?'color_777':'color_333'}}" wx:for="{
     {week}}" wx:key="id">{
   {item.title}}</view>
    </view>

    <view class="grid_c7_104 margin_t_26 grid_row_gap_16">
      <view class="height_104 dis_c_cc radius_6 text_align_center {
     {item.date===date&&!item.$b?'back_primary color_EEE':''}} {
     {item.date===newDate?'font_weight_800 font_style_oblique color_FF780A':''}} {
     {item.$isWeekend}}" wx:for="{
     {calendarArr}}" wx:key="id" data-item="{
     {item}}" catchtap="selectCalendar">
        <view>{
   {item.cDay}}</view>
        <view class="font_size_22 {
     {item.$festival}}">{
   {item.$SF}}</view>
      </view>
    </view>
  </view>

  <view class="margin_t_26 dis_r_c">
    <view class="width_95 dis_r_sa padding_tb_8 text_align_center shadow_0_0_6_6_CCC radius_8">
      <view wx:for="{
     {info.list}}" wx:key="id">
        <view>{
   {item.cTitle}}</view>
        <view>{
   {item.lTitle}}</view>
      </view>
    </view>
  </view>

  <view class="margin_t_26">
    <picker-view class="height_300" indicator-class="height_90" value="{
     {pickerVal}}" bindchange="bindChange">
      <picker-view-column>
        <view class="height_90 text_align_center dis_r_c" wx:for="{
     {years}}" wx:key="index">
          <text>{
   {item.title}}</text>
        </view>
      </picker-view-column>
      <picker-view-column>
        <view class="height_90 text_align_center dis_r_c" wx:for="{
     {months}}" wx:key="index">
          <text>{
   {item.title}}</text>
        </view>
      </picker-view-column>
    </picker-view>
  </view>
</view>

JavaScript

// 注意这里引入的方式
// 因为不想构建小程序
// 所以直接把下载好的日历转换文件夹放到小程序中引用即可
import calendar from '../../../utils/js-calendar-converter/src/index';

Page({
    
  /**
   * 页面的初始数据
   */
  data: {
    
    y: undefined,
    m: undefined,
    d: undefined,
    date: '',
    calendarArr: [],
    week: [{
    
        id: 'id0',
        title: '日',
        value: 0
      },
      {
    
        id: 'id1',
        title: '一',
        value: 1
      },
      {
    
        id: 'id2',
        title: '二',
        value: 2
      },
      {
    
        id: 'id3',
        title: '三',
        value: 3
      },
      {
    
        id: 'id4',
        title: '四',
        value: 4
      },
      {
    
        id: 'id5',
        title: '五',
        value: 5
      },
      {
    
        id: 'id6',
        title: '六',
        value: 6
      }
    ],
    info: {
    },
    years: [],
    months: [],
    pickerVal: [0, 0],
    newDate: ''
  },

  /**
   * 选择年份与月份
   * @param {object} obj
   * @return {undefined} undefined
   */
  bindChange({
     
    detail: {
     
      value
    }
  }) {
    
    let self = this,
      selfData = self.data,
      years = selfData.years,
      months = selfData.months,
      y = selfData.y,
      m = selfData.m,
      d = selfData.d,
      year = years[value[0]].value,
      month = months[value[1]].value,
      newDate = '';

	// 当滑动到不是当年当月的时候默认选中当月1号
    newDate = year !== y || month !== m ? `${
      year}-${
      month}-1` : `${
      year}-${
      month}-${
      d}`;

    self.setData({
    
      newDate,
      pickerVal: value
    }, () => self.createCalendar(year, month));
  },

  /**
   * 显示的信息
   * @param {object} obj
   * @return {Array} info
   */
  handleInfo(obj) {
    
    let list = [{
    
        id: 'id1',
        cTitle: obj.cYear + '年',
        lTitle: obj.gzYear + obj.Animal + '年'
      },
      {
    
        id: 'id2',
        cTitle: obj.cMonth + '月',
        lTitle: obj.gzMonth + obj.IMonthCn
      },
      {
    
        id: 'id3',
        cTitle: obj.cDay + '日',
        lTitle: obj.gzDay + obj.IDayCn
      },
      {
    
        id: 'id4',
        cTitle: obj.ncWeek,
        lTitle: obj.astro
      }
    ];

    obj.list = list;

    this.setData({
    
      info: obj
    });
  },

  /**
   * 创建日期
   * @param y 年
   * @return undefined
   */
  selectCalendar({
     
    currentTarget: {
     
      dataset: {
     
        item
      }
    }
  }) {
    
    this.handleInfo(item);
    this.setData({
    
      newDate: item.date
    });
  },

  /**
   * 创建日期
   * @param y 年
   * @param m 月
   * @param d 日
   * @return [{}]
   */
  creationDate(y, m, d) {
    
    let arr = [];

    for (let i = 1; i < d + 1; i++) {
    
      let obj = calendar.solar2lunar(y, m, i);

      arr.push({
    
        ...obj
      });
    }

    return arr;
  },

  /**
   * 收集创建日期需要的数据(重要函数)
   * @param {Number} y 年
   * @param {number} m 月
   * @return [{}]
   */
  createCalendar(y, m) {
    
    let self = this,
      selfData = self.data,
      newDate = selfData.newDate,
      y1 = y,
      y2 = y,
      y3 = y,
      m1 = m - 1,
      m2 = m,
      m3 = m + 1,
      d1 = undefined,
      d2 = undefined,
      d3 = undefined,
      arr1 = [],
      arr2 = [],
      arr3 = [],
      len2 = 0,
      nWeek1 = undefined,
      nWeek3 = undefined,
      info = {
    };

    if (m === 1)(y1 = y - 1, m1 = 12);
    if (m === 12)(y3 = y + 1, m3 = 1);

    d1 = calendar.solarDays(y, m1);
    d2 = calendar.solarDays(y, m2);
    d3 = calendar.solarDays(y, m3);

    arr1 = self.creationDate(y1, m1, d1);
    arr2 = self.creationDate(y2, m2, d2);
    arr3 = self.creationDate(y3, m3, d3);
    len2 = arr2.length;
    nWeek1 = arr2[0].nWeek;
    nWeek3 = arr2[len2 - 1].nWeek;

    nWeek1 = nWeek1 === 7 ? 0 : arr2[0].nWeek;
    nWeek3 = nWeek3 === 6 ? 0 : nWeek3 === 7 ? nWeek3 - 1 : 6 - nWeek3;

    // 前部分补全一个星期
    for (let i = arr1.length - 1; nWeek1 > 0; i--) {
    
      let item = arr1[i];

      item.$b = true;
      arr2.unshift(item);
      nWeek1--;
    }

    // 后部分补全一个星期
    for (let i = 0; i < nWeek3; i++) {
    
      let item = arr3[i];

      item.$b = true;
      arr2.push(item);
    }

    arr2 = arr2.map((item, i) => {
    
      if (item.IDayCn === '初一' && !item.festival && !item.Term && !item.lunarFestival) {
    
        item.$festival = '';
        item.$SF = item.IMonthCn;
      } else if (item.festival) {
    
        item.$festival = 'color_primary';
        item.$SF = item.festival;
      } else if (item.Term) {
    
        item.$festival = 'color_primary';
        item.$SF = item.Term;
      } else if (item.lunarFestival) {
    
        item.$festival = 'color_primary';
        item.$SF = item.lunarFestival;
      } else {
    
        item.$festival = '';
        item.$SF = item.IDayCn;
      }

      if (['星期六', '星期日'].includes(item.ncWeek) && item.cMonth === m) {
    
        item.$isWeekend = 'color_777';
      } else if (item.$b) {
    
        item.$isWeekend = 'color_CCC';
      } else {
    
        item.$isWeekend = 'color_333';
      }
      item.$id = `id${
      i+1}`;

      if (item.date === newDate) info = item;

      return item;
    });

    self.handleInfo(info);

    self.setData({
    
      calendarArr: arr2
    });
  },

  /**
   * 初始化
   */
  init() {
    
    let self = this,
      y = undefined,
      m = undefined,
      d = undefined,
      years = [],
      months = [],
      pickerVal = [],
      date = new Date();

    y = date.getFullYear();
    m = date.getMonth() + 1;
    d = date.getDate();

	// 获取100年时间的日历
    for (let i = y - 95; i <= y + 5; i++) years.push({
    
      id: `id${
      i}`,
      title: i + '年',
      value: i
    });

    for (let i = 0; i < 12; i++) months.push({
    
      id: `id${
      i}`,
      title: i + 1 + '月',
      value: i + 1
    });

    pickerVal = [
      years.findIndex(item => item.value === y),
      months.findIndex(item => item.value === m)
    ];

    self.setData({
    
        y,
        m,
        d,
        date: `${
      y}-${
      m}-${
      d}`,
        newDate: `${
      y}-${
      m}-${
      d}`,
        years,
        months
      },
      () => (self.createCalendar(y, m), self.setData({
    
        pickerVal
      })));
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    
    this.init();
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
    

  }
})
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_51157081/article/details/131971117

智能推荐

【Cisco Packet Tracer】运输层端口与DHCP的作用_cisco dhcp端口-程序员宅基地

文章浏览阅读1.7w次,点赞81次,收藏65次。这篇文章摘要将介绍人工智能在医疗领域的应用。随着技术的迅猛发展,人工智能在医疗诊断、治疗和研究方面展现出巨大的潜力。我们将深入探讨人工智能在医学影像解读上的应用,如何通过深度学习算法提高医生对X光、MRI等图像的准确性。_cisco dhcp端口

JavaScript----闭包函数-程序员宅基地

文章浏览阅读3.2k次,点赞5次,收藏16次。闭包函数 作用域链 优缺点_闭包函数

时序分解 | EEMD集合经验模态分解时间序列信号分解Matlab实现_eemd matlab-程序员宅基地

文章浏览阅读953次,点赞19次,收藏14次。信号去噪是信号处理中的一个重要课题,其目的是从含有噪声的信号中提取出有用信号。近年来,经验模态分解(EMD)算法因其在信号去噪方面的优异性能而备受关注。然而,传统EMD算法存在分解结果不稳定、易受噪声影响等问题。为了克服这些问题,本文提出了一种基于总体平均经验模态分解(EEMD)算法的信号去噪方法。_eemd matlab

Android腾讯微薄客户端开发八:微博查看(转播,对话,点评)-程序员宅基地

文章浏览阅读86次。Android如果是自己的微博,可以干掉它下面三幅图是转播,对话以及点评界面Java代码publicclassWeiboDetailActivityextendsActivity{privateDataHelperdataHelper;privateUserInfouser;p...

【lssvm分类】基于算术算法优化最小二乘支持向量机AOA-LSSVM实现数据分类附matlab-程序员宅基地

文章浏览阅读44次。在机器学习领域,支持向量机(Support Vector Machines,SVM)是一种广泛应用的分类算法。然而,传统的SVM算法在处理大规模数据集时存在一些问题,如计算复杂度高和内存占用大等。为了解决这些问题,一种基于算术算法优化的最小二乘支持向量机(AOA-LSSVM)被提出。AOA-LSSVM是一种改进的支持向量机算法,它通过对算术算法进行优化,提高了算法的效率和性能。它采用了最小二乘支持向量机(LSSVM)的思想,通过优化算法的求解过程,使得算法在处理大规模数据集时更加高效。_aoa-lssvm

如何在 nuxt.js 中使用 axios.js 在组件和页面请求数据?_nuxt怎么引入axios-程序员宅基地

文章浏览阅读965次。创建了前端工程,接下来开始写代码。因为初始化项目,只是最小的一些基本依赖,再开发中,需要一些第三方的库来支持,比如样式/组件库。_nuxt怎么引入axios

随便推点

git基础教程(21)git restore还原改动-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏2次。git restore <file>表示将在工作空间但是不在暂存区的文件撤销更改.git restore --staged <file>作用是将暂存区的文件从暂存区撤出,但不会更改文件。演示1:1、仓库初始状态:干净的仓库,下面有一个readme文件小静静@DESKTOP-MD21325 MINGW64 /d/test1/test1 (master)$ git statusOn branch masterYour branch is up to date with_git restore

远古项目实战丨用Python一秒搞定垃圾分类_python垃圾分类-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏18次。这是一个严肃又欢乐的七月,哲学界迎来新拷问。传统古典哲学的代表,是门口的保安大叔,他提出了三个经典问题:“你是谁?你从哪儿来?要到哪儿去?而后现代主义哲学的四位代表人物冒了出来,发出直指人内心的提问。食堂大妈:你要饭吗?配钥匙师傅:你配吗?算命先生:你算什么东西?滴滴司机:你搞清楚自己的定位没有?从本月起,魔都正式步入生活垃圾强制分类的时代。个人一旦违规混合投放垃圾,将被处以最高200元的罚款。新兴哲学代表垃圾分类阿姨正式上岗:你是什么垃圾?_python垃圾分类

【机器学习】机器学习之数据清洗_数据清洗论文包括代码-程序员宅基地

文章浏览阅读1.9w次,点赞9次,收藏8次。在实验中探索数据清洗的重要性以及清洗过程中的一些关键步骤,理解数据清洗是一个必要的预处理过程,用来帮助从原始数据中去除不准确、不完整或不适用于模型的记录,以确保所使用的数据是准确、可靠且适合用于模型训练,也可以帮助发现和纠正数据中的错误、缺失和不一致之处,以提高数据的质量和准确性。_数据清洗论文包括代码

Spring~debug源码, 完整走一遍Spring创建一个bean的总结-程序员宅基地

文章浏览阅读762次,点赞11次,收藏12次。即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!

Docker安装Oracle 12c_docker安装oracle12c-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏12次。Docker安装Oracle 12c_docker安装oracle12c

vulnhub:Y0USEF_vulnhub y0usef-程序员宅基地

文章浏览阅读829次,点赞2次,收藏2次。OSCP-4,主要利用方式:403请求绕过+文件上传绕过+RCE反弹shell 靶场: vulnhub.com 靶机名称: Y0USEF:1 难度: 中等_vulnhub y0usef

推荐文章

热门文章

相关标签