全网小程序日历实例最全

172 阅读3分钟

在开发这个功能的时候,也找了好多资料,最后看到这个朋友的分享,在他的基础进行了修改 一只敲码的猫 这个兼容IOS和安卓

话不多说,先上效果图

html

<view>
  <navigation class="sunnavigation" title="{{title}}"></navigation>
  <view class="container">
    <!-- 日历年月 -->
    <view class='calendar_title flex_nowrap'>
      <view class='icon' bindtap='lastMonth'>
        <image src='/images/index/ico3.png' />
      </view>
      <view>{{year}}年{{month}}月</view>
      <view class='icon icon1' bindtap='nextMonth'>
        <image src='/images/index/ico3.png' />
      </view>
    </view>

    <!-- 日历主体 -->
    <view class='calendar'>
      <view class="header_con">
        <view class='header'>
          <view wx:for='{{date}}' wx:key='idx' wx:for-index="idx" class='{{(index == todayIndex) && isTodayWeek ? "weekMark" : ""}}'>{{item}}
            <view></view>
          </view>
        </view>
      </view>
      <view class='date-box'>
        <block wx:for='{{dateArr}}' wx:key='idx' wx:key='idx'>
          <view class='{{item.isSwith ? "nowDay" : ""}} {{item.sectionSwith ? "section" : ""}}'>
            <view class='date-head' bindtap='lookHuoDong' data-year='{{year}}' data-month='{{month}}' data-item='{{item}}' data-datenum='{{item.dateNum}}'>
              <view>{{item.dateNum}} </view>
            </view>
          </view>
        </block>
      </view>
      
    </view>
    <!-- 确定 -->
    <view class="his_define {{enableSwith? 'active': ''}}" catchtap="defineTap">
      确定
    </view>
  </view>
</view>

js

const app = getApp()
import util from '../../utils/util'
Page({

  /**
   * 页面的初始数据
   */
  data: {
    title: '历史记录',
    year: 0, // 年
    month: 0, // 月
    date: ['日', '一', '二', '三', '四', '五', '六'],
    dateArr: [],
    isToday: 0,
    isTodayWeek: false,
    todayIndex: 0,
    starTime: '',  // 开始时间
    endTime: '',  // 结束时间
    enableSwith: false, // 确定按钮  false禁用  true启用
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad (e) {
    // 获取导航栏主动设置返回按钮
    const nav = this.selectComponent('.sunnavigation')
    nav.showBack()
    console.log('e', e)
    // 日历的
    let now = new Date();
    let year = now.getFullYear();
    let month = now.getMonth() + 1;
    this.dateInit();
    console.log('123','' + year + month + now.getDate())
    this.setData({
      year: year,
      month: month,
      isToday: '' + year + month + now.getDate()
    })
  },
  // 生成日历数据
  dateInit (setYear, setMonth) {
    //全部时间的月份都是按0~11基准,显示月份才+1
    let dateArr = []                      //需要遍历的日历数组数据
    let arrLen = 0                           //dateArr的数组长度
    let now = setYear ? new Date(setYear, setMonth) : new Date()
    let year = setYear || now.getFullYear()
    let nextYear = 0;
    let month = setMonth || now.getMonth()                   //没有+1方便后面计算当月总天数
    let nextMonth = (month + 1) > 11 ? 1 : (month + 1)
    let startWeek = new Date(year + '/' + (month + 1) + '/' + 1).getDay()                 //目标月1号对应的星期
    let dayNums = new Date(year, nextMonth, 0).getDate()               //获取目标月有多少天
    let obj = {}
    let num = 0

    if (month + 1 > 11) {
      nextYear = year + 1;
      dayNums = new Date(nextYear, nextMonth, 0).getDate()
    }
    arrLen = startWeek + dayNums;
    for (let i = 0; i < arrLen; i++) {
      if (i >= startWeek) {
        num = i - startWeek + 1;
        obj = {
          isToday: '' + year +'-'+ (month + 1)+'-' + num,
          dateNum: num,
          isSwith: false,
          sectionSwith: false
        }
      } else {
        obj = {};
      }
      dateArr[i] = obj;
    }
    this.setData({
      dateArr: dateArr
    })

    let nowDate = new Date();
    let nowYear = nowDate.getFullYear();
    let nowMonth = nowDate.getMonth() + 1;
    let nowWeek = nowDate.getDay();
    let getYear = setYear || nowYear;
    let getMonth = setMonth >= 0 ? (setMonth + 1) : nowMonth;

    if (nowYear == getYear && nowMonth == getMonth) {
      console.log('进来1', nowYear, getYear,nowMonth, getMonth, nowWeek)
      this.setData({
        isTodayWeek: true,
        todayIndex: nowWeek
      })
    } else {
      console.log('进来2', nowYear, getYear,nowMonth, getMonth)
      this.setData({
        isTodayWeek: false,
        todayIndex: -1
      })
    }
  },
   /**
   * 上月切换
   */
  lastMonth() {
    //全部时间的月份都是按0~11基准,显示月份才+1
    let year = this.data.month - 2 < 0 ? this.data.year - 1 : this.data.year;
    let month = this.data.month - 2 < 0 ? 11 : this.data.month - 2;
    let day = this.data.currentTime // 当前时间
    // console.log(day)
    this.setData({
      year: year,
      month: (month + 1),
      isToday: ''
    })
    this.dateInit(year, month, day)
    // 回显点击效果
    this.echoDate()
  },
  /**
   * 下月切换
   */
  nextMonth() {
    //全部时间的月份都是按0~11基准,显示月份才+1
    let year = this.data.month > 11 ? this.data.year + 1 : this.data.year;
    let month = this.data.month > 11 ? 0 : this.data.month;
    let day = this.data.currentTime // 当前时间
    this.setData({
      year: year,
      month: (month + 1),
      isToday: ''
    })
    this.dateInit(year, month, day)
    // 回显点击效果
    this.echoDate()
    
  },
  // 跨年、跨月
  echoDate(){
    let dateArr = this.data.dateArr
    let endTime = this.data.endTime
    this.getDateArr(dateArr,endTime,2)
  },
  // 日历 日期点击方法
  lookHuoDong(e) {
    let dateArr = this.data.dateArr
    let attr = e.currentTarget.dataset
    // console.log('e', e, dateArr)
    // 
    let starTime = new Date(this.data.starTime).getTime()
    let endTime = new Date(this.data.endTime).getTime()
    let isToday = new Date(attr.item.isToday).getTime()
    if(!starTime) {
      console.log('没有开始时间')
      starTime = isToday
      this.setData({
        starTime
      })
      /*
        参数: 日历数组,开始时间
      */ 
      this.getDateArr(dateArr, starTime)
    }else if(starTime && !endTime) {
      
      if(starTime && starTime>isToday) {
        console.log('有开始时间,但是点击的时间小于开始时间')
        endTime = starTime
        starTime = isToday
        this.setData({
          endTime,
          starTime
        })
        this.getDateArr(dateArr, starTime)
      } else {
        console.log('没有结束时间')
        endTime = isToday
        this.setData({
          endTime
        })
        this.getDateArr(dateArr, endTime)
      }
      
    }else if(starTime && endTime) {
      console.log('有开始时间和结束时间')
      if(starTime>isToday) {
        console.log('有开始时间和结束时间,但是点击的时间小于开始时间')
        endTime = starTime
        starTime = isToday
        console.log('复用', endTime, starTime)
        this.setData({
          endTime,
          starTime
        })
        this.getDateArr(dateArr,starTime,2)
      } else if(isToday>starTime){
        endTime = isToday
        this.setData({
          endTime
        })
        this.getDateArr(dateArr,endTime,2)
      } 
    }
  },
  // 处理数组,如果时间相等isSwith为true
  getDateArr(arr,date, type) {
    /*
      参数
      arr 数组    date  要选择的日期  另外一个时间 
      type 类型  1和2
    */ 
   let starTime = this.data.starTime
   let endTime = this.data.endTime

  //  console.log('arr',arr)
    if(!type) {
      arr.forEach(item => {
        if(!item.isToday){
          return
        }
        let isToday = new Date(item.isToday).getTime()
        if(isToday == date) {
          item.isSwith = true
        }
        if(starTime && endTime) {
          console.log('123')
          this.setData({
            enableSwith: true
          })
          if(isToday>starTime && isToday<endTime) {
            item.sectionSwith = true
          } else {
            item.sectionSwith = false
          }
        }
      })
      // console.log('dateArr', arr)
      this.setData({
        dateArr: arr
      })
    } else if(type ==2) {
      this.setData({
        enableSwith: true
      })
      console.log('date', starTime,endTime)
      arr.forEach(item => {
        if(!item.isToday){
          return
        }
        item.isSwith = false
        item.sectionSwith = false
      })
      // console.log('清空', arr)
      arr.forEach(item => {
        if(!item.isToday){
          return
        }
        let isToday = new Date(item.isToday).getTime()
        if(isToday == starTime || isToday == endTime) {
          item.isSwith = true
        }
        if(isToday>starTime && isToday<endTime) {
          item.sectionSwith = true
        } else {
          item.sectionSwith = false
        }
      })
      this.setData({
        dateArr: arr
      })
    }
    
  },
  // 确定按钮 
  defineTap() {
    let starTime = this.data.starTime
    let endTime = this.data.endTime
    app.globalData.historyStar = starTime
    app.globalData.historyEnd = endTime
    wx.setStorageSync('historySwith', true)
    // 返回一步
    wx.navigateBack({
      delta: 1
    })
  }
  

})

总结

这个难点就是在处理开始时间和结束时间,把他们之间的时间回显颜色,平常多看想多做,只能这样技术才能一点点提升,如果觉得有帮助记得帮助记得点赞关注,谢谢了