百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

微信小程序之实现常用日期格式-月历滑动格式(三)

bigegpt 2024-08-27 11:57 2 浏览

示例简介

本文介绍项目中常用到的日期格式--月历滑动格式,顶部显示当前月的月历,默认选择当天的日期,且能滑动月历选择需要的日期:

实现过程

1、先实现页面效果,文件*.wxml和*.wxss代码如下:

1)滑动功能使用组件scroll-view,样式实现参考下面代码;为了实现加载时默认选择当天的日期,可使用组件属性scroll-into-view,属性值“toView”需用setData设置,不然不起作用;

2)item.isDisable ? 'opacity30' : (item.year === selectDay.year && item.month === selectDay.month && item.day === selectDay.day?'select':'')的实现原理,判断是否有效期(isDisable ),非有效期增加'opacity30'实现透明度30%效果;而有效期判断是否被选中,选中则增加'select'实现高亮效果;

<view class="container">
  <view class="tabs-box">
    <scroll-view class="time-tabs" scroll-x scroll-into-view="{{toView}}" scroll-with-animation>
      <view wx:for="{{list}}" wx:key="index" class="day {{item.isDisable ? 'opacity30' : (item.year === selectDay.year && item.month === selectDay.month && item.day === selectDay.day?'select':'')}}" catchtap="selectChange" data-day="{{item.day}}" data-year="{{item.year}}" data-month="{{item.month}}" data-date-string="{{item.dateString}}" data-week-day="{{item.weekDay}}" data-isdisable="{{item.isDisable}}" id="{{item.id}}">
        <view class="month">{{item.year}}-{{item.month}}</view>
        <view class="text {{item.isWeekend ? 'orange' : ''}}">
          {{item.day}}
        </view>
        <view class="week">{{item.week}}</view>
      </view>
    </scroll-view>
    <view class="remark"><text>滑动选择更多日期</text></view>
  </view>
  <view class="timeList">
    <view class="table">
      <view class="tr title">
        <view class="th first">时间段</view>
        <view class="th center">剩余数</view>
        <view class="th last">操作</view>
      </view>
      <scroll-view scroll-y="true" style="height: {{clientHeight?clientHeight-tabsBoxHeight-titleHeight+'px':'auto'}}">
        <view class="tr septalLine" wx:for="{{timeList}}" wx:key="id">
          <view class="td first">{{item.time}}</view>
          <view class="td center">{{item.bookingNumber}}</view>
          <view class="td last">预约</view>
        </view>
      </scroll-view>
    </view>
  </view>
</view>
/* 日期选择 */
.tabs-box {
  height: 228rpx;
}
.time-tabs {
  white-space: nowrap;
}


.time-tabs .day {
  display: inline-block;
  width: 150rpx;
  height: 170rpx;
  text-align: center;
  position: relative;
  font-size: 26rpx;
  border: 2rpx solid #E6E6E6;
}


.time-tabs .day.opacity30 {
  opacity: 0.3;
}


.time-tabs .day .month {
  color: #E6E6E6;
  padding: 10rpx 0 14rpx;
}


.time-tabs .day .text {
  font-size: 32rpx;
  color: #343434;
  font-weight: bold;
}


.time-tabs .day .week {
  color: #999;
  background-color: #F0F3F5;
  position: absolute;
  bottom: 0;
  width: 100%;
  text-align: center;
  padding: 8rpx 0;
}


.time-tabs .day .orange {
  color: #FA7014;
}


.time-tabs .day.select {
  border-color: #3E7AF5;
}


.time-tabs .day.select .month, .time-tabs .day.select .text {
  color: #3E7AF5;
}


.time-tabs .day.select .week {
  color: #fff;
  background-color: #3E7AF5;
}


.remark {
  color: #9A9A9A;
  font-size: 26rpx;
  text-align: center;
  margin-top: 20rpx;
}


.remark image {
  width: 32rpx;
  height: 14rpx;
  vertical-align: middle;
  margin-top: -6rpx;
}


.remark text {
  margin: 0 6rpx
}


/* 预约时间列表 */
.table {
  padding: 0 30rpx;
}


.table .tr {
  display: flex;
  padding: 40rpx 0 30rpx;
}


.table .tr .th {
  color: #666;
  margin-bottom: 10rpx;
}


.table .tr .th, .table .tr .td {
  text-align: center;
}


.table .tr .td {
  font-size: 32rpx;
  color: #343434;
}


.table .tr .first {
  width: 188rpx;
}


.table .tr .center {
  flex: 1;
}


.table .tr .last {
  width: 120rpx;
}


.table .tr .td.last {
  height: 60rpx;
  line-height: 60rpx;
  border: 2rpx solid #3E7AF5;
  color: #3E7AF5;
  border-radius: 8rpx;
  font-size: 28rpx;
  margin-top: -12rpx;
}

2、接下来实现交互逻辑,文件*.js代码实现如下:

1)dateInit函数用于获取渲染的日历主体信息和所需要的data各种数据;

2)onLoad实现获取当天日期并渲染主体数据,加了判断是否选中过日期来变化高亮日期天数;并计算日期列表的高度,实现只滚动日期列表,不影响滑动切换日期和查看标题;

3)selectChange函数用于点击后把选中日期数据,如果要实现选中不同日期显示不同的日期列表,可在这里增加传参数调接口获取数据后替换timeList的数据。

import util from '../../utils/util.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    tabsBoxHeight: 0, // 时间选择高度
    titleHeight: 0, // 时间列表高度
    clientHeight: 0, //可视区域高度
    nowDay: {}, // 今天日期
    selectDay: {}, // 选中时间
    list: [],
    toView: 't1', // 用于定位滚动位置
    timeList: [{
      id: 1,
      time: '08:30-09:00',
      bookingNumber: 4
    }, {
      id: 2,
      time: '09:00-09:30',
      bookingNumber: 10
    }, {
      id: 3,
      time: '09:00-09:30',
      bookingNumber: 10
    }, {
      id: 4,
      time: '09:00-09:30',
      bookingNumber: 10
    }, {
      id: 5,
      time: '09:00-09:30',
      bookingNumber: 10
    }, {
      id: 6,
      time: '09:00-09:30',
      bookingNumber: 10
    }, {
      id: 7,
      time: '09:00-09:30',
      bookingNumber: 10
    }]
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 计算时间高度
    let that = this;
    this.nodeHeight('.tabs-box', 'tabsBoxHeight');
    this.nodeHeight('.tr.title', 'titleHeight');
    console.log(this.data)
    wx.getSystemInfo({
      success: function (res) {
        console.log(res.windowHeight)
        that.setData({
          // 可视区域高度
          clientHeight: res.windowHeight
        });
      }
    });


    // 获取当前日期信息
    let now = new Date();
    let month = now.getMonth() + 1;
    month = month >= 10 ? month : '0' + month;
    let day = now.getDate();
    day = day >= 10 ? day : '0' + day;
    let nowDay = {
      year: now.getFullYear(),
      month,
      day
    }
    let selectDay = nowDay;
    this.setData({
      nowDay,
      selectDay
    });
    this.dateInit(nowDay.year, nowDay.month);
  },
  // 日历主体的渲染方法
  dateInit(setYear, setMonth) {
    // 循环月数据
    let now = new Date(setYear, setMonth - 1); // 当前月份的1号
    let dayNum = new Date(setYear, setMonth, 0).getDate(); // 当前月有多少天


    let list = [];
    let toView;
    for (let j = 0; j < dayNum; j++) {
      const now2 = new Date(now);
      now2.setDate(j + 1);


      let obj = {};
      let day = now2.getDate();
      day = day >= 10 ? day : '0' + day; // 补0


      let month = now2.getMonth() + 1;
      month = month >= 10 ? month : '0' + month; // 补0


      let year = now2.getFullYear();
      let weekDay = now2.getDay();
      let week = util.getWeeks(weekDay);
      let nowDay = this.data.nowDay;
      let isDisable;
      // 用于判断本月小于今天,下个月大于今天的日期不能选择
      if (month == nowDay.month) {
        isDisable = (day < nowDay.day) ? true : false;
      } else {
        isDisable = (day >= nowDay.day) ? true : false;
      }
      // 获取今天的id前两个数字
      if (day == nowDay.day) {
        toView = 't' + (j - 2);
      }


      obj = {
        id: 't' + j,
        day,
        month,
        year,
        weekDay,
        week,
        dateString: util.formatTime(now2),
        isWeekend: (weekDay === 0 || weekDay === 6) ? true : false, // 是否周末
        isDisable
      };
      list[j] = obj;
    }
    this.setData({
      list,
      toView // 赋值需定位的位置
    })
  },
  // 一天被点击时
  selectChange(e) {
    const weekDay = e.currentTarget.dataset.weekDay;
    const isDisable = e.currentTarget.dataset.isdisable;
    // 非有效期不能预约
    if (isDisable) {
      util.showToast('请选择有效期', 'none');
      return false;
    }
    // 周末不能预约
    if (weekDay === 0 || weekDay === 6) {
      util.showToast('请选择非休息日', 'none');
      return false;
    }
    // 获取星期几
    let weeks = util.getWeeks(weekDay);


    const year = e.currentTarget.dataset.year
    const month = e.currentTarget.dataset.month
    const day = e.currentTarget.dataset.day
    const dateString = e.currentTarget.dataset.dateString
    const selectDay = {
      year: year,
      month: month,
      day: day,
      dateString: dateString + ' ' + weeks
    }
    this.setData({
      selectDay: selectDay
    });
  },
  // 获取节点高度
  nodeHeight(nodeName, nodeHeight) {
    let that = this;
    var query = wx.createSelectorQuery();
    query.select(nodeName).boundingClientRect();
    query.exec(function (res) {
      switch (nodeHeight) {
        case 'tabsBoxHeight':
          that.setData({
            tabsBoxHeight: res[0].height
          });
          break;
        case 'titleHeight':
          that.setData({
            titleHeight: res[0].height
          });
          break;
      }
    });
  }
})

相关推荐

10w qps缓存数据库——Redis(redis缓存调优)

一、Redis数据库介绍:Redis:非关系型缓存数据库nosql:非关系型数据库没有表,没有表与表之间的关系,更不存在外键存储数据的形式为key:values的形式c语言写的服务(监听端口),用来存...

Redis系列专题4--Redis配置参数详解

本文基于windowsX64,3.2.100版本讲解,不同版本默认配置参数不同在Redis中,Redis的根目录中有一个配置文件(redis.conf,windows下为redis.windows....

开源一夏 | 23 张图,4500 字从入门到精通解释 Redis

redis是目前出场率最高的NoSQL数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。...

redis的简单与集群搭建(redis建立集群)

Redis是什么?是开源免费用c语言编写的单线程高性能的(key-value形式)内存数据库,基于内存运行并支持持久化的nosql数据库作用主要用来做缓存,单不仅仅是做缓存,比如:redis的计数器生...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlusRedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows、Linux...

关于Redis在windows上运行及fork函数问题

Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在...

你必须懂的Redis十大应用场景(redis常见应用场景)

Redis作为一款高性能的键值存储数据库,在互联网业务中有着广泛的应用。今天,我们就来详细盘点一下Redis的十大常用业务场景,并附上Golang的示例代码和简图,帮助大家更好地理解和应用Redis。...

极简Redis配置(redis的配置)

一、概述Redis的配置文件位于Redis安装目录下,文件名为redis.conf(Windows名为redis.windows.conf,linux下的是redis.conf)你可以通过C...

什么是redis,怎么启动及如何压测

从今天起咱们一起来学习一下关于“redis监控与调优”的内容。一、Redis介绍Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。...

一款全新Redis UI可视化管理工具,支持WebUI和桌面——P3X Redis UI

介绍P3XRedisUI这是一个非常实用的RedisGUI,提供响应式WebUI访问或作为桌面应用程序使用,桌面端是跨平台的,而且完美支持中文界面。Githubhttps://github....

windows系统的服务器快速部署java项目环境地址

1、mysql:https://dev.mysql.com/downloads/mysql/(msi安装包)2、redis:https://github.com/tporadowski/redis/r...

window11 下 redis 下载与安装(windows安装redis客户端)

#热爱编程是一种怎样的体验#window11下redis下载与安装1)各个版本redis下载(windows)https://github.com/MicrosoftArchive/r...

一款轻量级的Redis客户端工具,贼好用!

使用命令行来操作Redis是一件非常麻烦的事情,我们一般会选用客户端工具来操作Redis。今天给大家分享一款好用的Redis客户端工具TinyRDM,它的界面清新又优雅,希望对大家有所帮助!简介Ti...

一个.NET开发且功能强大的Windows远程控制系统

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍SiMayRemoteMonitorOS是一个基于Windows的远程控制系统,完...

Redis客户端工具详解(4款主流工具)

大家好,我是mikechen。Redis是大型架构的基石,也是大厂最爱考察内容,今天就给大家重点详解4款Redis工具@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集...