小程序日历+时间选择组件

本文详细介绍了小程序中的日历和时间选择组件的JavaScript、WXML和WXSS实现,包括数据绑定、交互逻辑和页面使用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

展示

日历时间选择组件

js部分

// component/timepick/timepick.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    'calednar': {
      type: Boolean,
      value: '',
      observer: function(newVal, oldVal) {
        // 属性值变化时执行
        this.setData({
          if_calednar: newVal
        })
      }
    },
  },
  ready: function() {
    
  },
  /**
   * 组件的初始数据
   */
  data: {
    if_calednar: true,
    weeks: ['日', '一', '二', '三', '四', '五', '六'],
    days: [],
    year: 0,
    month: 0,
    day: 1,
    time: '00:00',
    nowday: "",
    leftIcon: "",
    nowtime: "",
    iftoday: "",
  },

  /**
   * 组件的方法列表
   */
  lifetimes: {
    // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
    attached: function() {
      this.dateData()
      this.ifnowday()
      this.ifnowtime()
    },
    moved: function() {},
    detached: function() {},
  },
  methods: {
    togglebg(data) {
      bglayer = {
        data: data
      }
      this.triggerEvent('togglebg', bglayer)
    },
    // 日历
    // 选择时间(日历弹窗)
    choseTime(e) {
      var id = e.currentTarget.dataset.id
      this.setData({
        if_calednar: false,
        timeState: id
      })
    },
    // 日历操作
    // 用户改变月份
    changemonth: function(e) {
      var id = e.currentTarget.dataset.id
      var month;
      var year;
      var day;
      month = this.data.month
      year = this.data.year
      day = this.data.day
      var date = new Date();
      var nowyear = date.getFullYear();
      var nowmonth = date.getMonth() + 1;
      var nowday = date.getDate()
      var hour = date.getHours()
      var minute = date.getMinutes()
      var nowtime = hour + ":" + minute

      if (id == "mius") {
        month--
        if (month < 1) {
          month = 12
          year--
        }
      } else if (id == "add") {
        month++
        if (month > 12) {
          month = 1
          year++
        }
      }
      if (nowyear == year && nowmonth == month && nowday == day) {
        this.setData({
          nowtime: nowtime,
          iftoday: true
        })
      } else {
        this.setData({
          iftoday: false
        })
      }
      if (minute < 10) {
        minute = "0" + minute
      }
      if (hour < 10) {
        hour = "0" + hour
      }
      var time = hour + ":" + minute
      this.updateDays(year, month, day, time)
    },
    // 日历读取
    dateData: function() {
      var date = new Date();
      var days = [];
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      var day = date.getDate()
      var hour = date.getHours()
      var minute = date.getMinutes()
      if (minute < 10) {
        minute = "0" + minute
      }
      if (hour < 10) {
        hour = "0" + hour
      }
      var time = hour + ":" + minute
      this.updateDays(year, month, day, time)
    },
    updateDays: function(year, month, day, time) {
      var days = [];
      var dateDay, dateWeek;
      // 根据日期获取每个月有多少天
      var getDateDay = function(year, month) {
        return new Date(year, month, 0).getDate();
      }
      //根据日期获取这天是周几
      var getDateWeek = function(year, month) {
        return new Date(year, month - 1, 1).getDay();
      }
      dateDay = getDateDay(year, month)
      dateWeek = getDateWeek(year, month)
      //向数组中添加天
      for (let index = 1; index <= dateDay; index++) {
        days.push(index)
      }
      //向数组中添加,一号之前应该空出的空格
      for (let index = 1; index <= dateWeek; index++) {
        days.unshift(0)
      }
      this.setData({
        days: days,
        year: year,
        month: month,
        day: day,
        time: time,
      })
      this.ifnowday()
    },
    // 选择某个day
    clickdata(e) {
      var nowyear = this.data.year
      var nowmonth = this.data.month
      var nowday = e.currentTarget.dataset.id
      var date = new Date();
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      var day = date.getDate()
      var hour = date.getHours()
      var minute = date.getMinutes()
      var nowtime = hour + ":" + minute
      if (nowyear == year && nowmonth == month && nowday == day) {
        this.setData({
          nowtime: nowtime,
          iftoday: true
        })
      } else {
        this.setData({
          iftoday: false
        })
      }

      this.setData({
        day: nowday
      })
    },
    // 选择时间
    time_select(e) {
      var time = e.detail.value
      this.setData({
        time: time
      })
    },
    // 判断时间
    ifnowtime(e) {
      var nowyear = this.data.year
      var nowmonth = this.data.month
      var nowday = this.data.day
      var date = new Date();
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      var day = date.getDate()
      var hour = date.getHours()
      var minute = date.getMinutes()
      var nowtime = hour + ":" + minute
      if (nowyear == year && nowmonth == month && nowday == day) {
        this.setData({
          nowtime: nowtime,
          iftoday: true
        })
      } else {
        this.setData({
          iftoday: false
        })
      }
    },
    // 日历上的确定按钮
    sure_btn(e) {
      var timeStatus = this.data.timeState
      var list = this.data.order_list
      var state = this.data.time_state
      var year = this.data.year
      var month = this.data.month
      var day = this.data.day
      var time = this.data.time
      var date = {}
      if (month < 10) {
        month = "0" + month
      }
      if (day < 10) {
        day = "0" + day
      }
      date.year = year
      date.month = month
      date.day = day
      date.time = time
      var timeData = year + "-" + month + "-" + day + "T" + time + ":" + "00"

      this.setData({
        if_calednar: true,
      })
      var data = {
        "time": timeData,
        "if_calednar": true
      }
      this.triggerEvent("timeData", data)
    },
    // 判断年份大小
    ifnowday(e) {
      var date = new Date()
      var year = this.data.year
      var month = this.data.month
      var nowyear = date.getFullYear()
      var nowmonth = date.getMonth() + 1
      var nowday = date.getDate()
      if (year == nowyear && month <= nowmonth) {
        this.setData({
          month:nowmonth,
          leftIcon: true,
          day: nowday
        })
      } else {
        this.setData({
          leftIcon: false
        })
      }
      this.setData({
        nowday: nowday
      })
    },
    // 失去焦点
    lostTime(e) {
      this.setData({
        if_calednar: true,
      })
      var data = {
        "if_calednar": true
      }
      this.triggerEvent("lostTime", data)
    },
  },
})

wxss部分

.unlight{
  opacity: 0.5;
}

/* 日历部分 */
.date {
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 50rpx;
  position: relative;
}
.topYM{
  width: 210rpx;
  margin: 50rpx
}
.direction {
  width: 50rpx;
  height: 50rpx;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 0;
  text-align: center;
  display: flex;
  display: -webkit-flex;
}
.leftIcon{
  width: 14rpx;
  height: 24rpx;
  align-self: center;
  margin: 0 auto;
}
.rightIcon{
  width: 14rpx;
  height: 24rpx;
  align-self: center;
  margin: 0 auto;
}
.header {
  display: flex;
  flex-direction: row;
  margin:  0 68rpx 48rpx 68rpx;
}

.weeks-item-text {
  width: 100%;
  font-size: 24rpx;
  text-align: center;
  font-weight: bold;
  opacity: 0.3;
}

.body-days {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  text-align: center;
  margin: 0 68rpx;
}

.days-item {
  width: 64rpx;
  height: 64rpx;
  display: flex;
  justify-content: center;
  align-content: center;
  margin-top: 10rpx;
  margin-left: 22rpx;
}

.days-item-text {
  width: 64rpx;
  font-size: 32rpx;
  color: #333;
  align-self: center;
}
.light{
  background-color: rgba(96, 195, 255, 1);
  color: white;
}
.sure_btn{
  font-size: 30rpx;
  color: rgba(96, 195, 255, 1);
  font-weight: bold;
  position: absolute;
  top: 40rpx;
  right: 40rpx;
  z-index: 9;
}
.calednar{
  position: fixed;
  z-index: 1997;
  bottom: 160rpx;
  background-color: #fff;
  height: 700rpx;
  width: 100%;
  border-radius: 20rpx 20rpx 0 0;
}
.calednarImg{
  width: 34rpx;
  height: 32rpx;
  position: absolute;
  right: 20rpx;
  top: 0;
  bottom: 0;
  margin: auto 0;
}
.bg_layer{
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1996;
  background-color: rgba(51, 51, 51, 1);
  opacity: 0.3;
}
.time{
  width: 100%;
  height: 160rpx;
  background-color: rgba(245, 245, 245, 1);
  position: fixed;
  bottom: 0;
  z-index: 1999;
  text-align: center;
}
.time_text{
  font-size: 48rpx;
  margin-top: 36rpx;
  letter-spacing: 6rpx;
}

/* 输入框的占位符样式 */
.placeholderClass{
  color: rgba(51, 51, 51, 0.3);
  
}

.inputClass{
  width: 316rpx;
  height: 64rpx;
  border: 2rpx solid #E2E8ED;
  padding: 0 20rpx;
  font-size: 24rpx;
  font-weight: bold;
  color: #333;
}

wxml部分

<!-- 日历时间弹窗 -->
<view bindtouchmove='aaa' hidden='{{if_calednar}}'>
  <view class='bg_layer' bindtouchmove='_aaa' bindtap="lostTime"></view>
  <view class='calednar'>
    <view class='sure_btn' bindtap='sure_btn'>确定</view>
    <view class="date">
    <view class="direction" data-id="mius" bindtap='changemonth' hidden="{{leftIcon}}" style="left:150rpx">
    <image class="leftIcon" src='/images/left.png' />
    </view>
      
      <label class="topYM">{{year}}年{{month}}月</label>
      <view class="direction" data-id="add" bindtap='changemonth' style="right:150rpx">
      <image class="rightIcon" src='/images/right.png'/>
      </view>
      
    </view>
    <view class="header">
      <block wx:for="{{weeks}}" wx:key="index">
        <text class="weeks-item-text">{{item}}</text>
      </block>
    </view>
    <view class="body-days">
      <block wx:for="{{days}}" wx:key="index">
        <view class="days-item {{item==day?'light':''}}">
          <view class="days-item-text {{item==day?'light':''}} {{leftIcon==true?(item<nowday?'unlight':''):''}}" bindtap="{{leftIcon==true?(item>=nowday?'clickdata':''):'clickdata'}}" data-id='{{item}}' wx:if="{{item>0}}">{{item}}</view>
        </view>
      </block>
    </view>
  </view>
  <view class="time">
    <picker mode="time" value="{{time}}" start="{{iftoday==true?nowtime:''}}" end="" bindchange="time_select" bindtap="ifnowtime">
      <view class="time_text">{{time}}</view>
    </picker>
  </view>
</view>

页面使用

<timepick calednar="{{if_calednar}}" bind:timeData="timeData"></timepick>

补充说明

该组件实现比较久远了,可能有部分地方还没有完善,欢迎大家评论区提出来

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值