小程序日期(日历)时间 选择器组件

这篇具有很好参考价值的文章主要介绍了小程序日期(日历)时间 选择器组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

封装一个小程序日期(日历)时间 选择器组件

简要说明:
一共两个版本 ,date-time-picker 和 date-time-picker-plus.
date-time-picker 弹窗层是 基于 vant-weapp 的 van-popup 组件实现的
date-time-picker-plus 弹窗层是 基于 小程序 自带的 page-container 组件来实现的
*注意:date-time-picker 需要下载 vant-weapp 组件库配合一起使用,date-time-picker-plus 可以直接在小程序里面使用

首先看一下效果图

小程序日期组件,小程序,Vant-UI,小程序,javascript,ui

组件代码

两个版本代码几乎一样,只是弹窗层用的不一样,这里我就用 基于 vant-weapp UI一起使用的版本来写

  • wxml 中
<view class="date-time-picker-box">
  <van-popup show="{{ show }}" zIndex="9999" round position="bottom" custom-style="border-radius:16px 16px 0 0;min-height:355px;max-height:400px;" bind:close="handleCancel">
    <view class="date-time-picker-title">
      <view class="date-time-picker-nav">
        <view bindtap="handleChangeTag" data-index="0" class="tag date-tag {{currentIndex == 0 ? 'active' : ''}}">
          {{year}}{{month}}{{day}}</view>
        <view bindtap="handleChangeTag" data-index="1" class="tag time-tag {{currentIndex == 1 ? 'active' : ''}}">
          {{hour}}:{{minute}}
        </view>
        <view class="date-time-line" style="left:{{left}}px;width: {{width}}px;"></view>
      </view>
      <button bindtap="handleConfirm" class="date-picker-oper-btn">确定</button>
    </view>
    <view class="date-time-picker-content">
      <!-- 日历主体 -->
      <swiper current="{{currentIndex}}" style="height:100%;">
        <swiper-item catchtouchmove="catchtouchmove">
          <view class="swiper-item ">
            <!-- 日历组件 -->
            <calendar bindselectDay="selectDay" bindgetDateList="getDateList" vertical="{{vertical}}"></calendar>
          </view>
        </swiper-item>
        <swiper-item catchtouchmove="catchtouchmove">
          <view class="swiper-item ">
            <div class="date-time-item">
              <picker-view indicator-style="height: 50px;" style="width: 100%; height: 200px;text-align:center;" value="{{value}}" bindpickstart="bindpickstart" bindpickend="bindpickend" bindchange="bindChange">
                <picker-view-column>
                  <view wx:for="{{hours}}" wx:key="*this" style="line-height: 50px">{{item}}</view>
                </picker-view-column>
                <picker-view-column>
                  <view wx:for="{{minutes}}" wx:key="*this" style="line-height: 50px">
                    {{item}}</view>
                </picker-view-column>
              </picker-view>
            </div>
          </view>
        </swiper-item>
      </swiper>
    </view>
  </van-popup>
</view>
  • wxss 中
.date-time-picker-box .date-time-picker-title {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0rpx 48rpx;
  height: 112rpx;
  box-sizing: border-box;
  border-bottom: 2rpx solid #E5E3E3;
  max-height: 400px;
  /* overflow: hidden; */
}

.date-time-picker-box .date-time-picker-title .title-txt {
  font-size: 17px;
  font-weight: 500;
  color: #1F1E1E;
}

.date-time-picker-box .date-time-picker-title .date-picker-oper-btn {
  width: 104rpx;
  height: 64rpx;
  line-height: 64rpx;
  text-align: center;
  font-size: 28rpx;
  border-radius: 8rpx;
  font-weight: 500;
  margin: 0;
  padding: 0;
  color: var(--themeTxtColor);
  background-color: var(--themeColor);
}

.date-time-picker-box .date-time-picker-title .cancel-btn {
  color: #5C5959;
  background-color: #fff;
  text-align: left;
}

.date-time-picker-box .date-time-picker-title .date-time-picker-nav {
  position: relative;
  display: flex;
  align-items: center;
  font-weight: 500;
  color: #8F8D8D;
  height: 100%;
}

.date-time-picker-box .date-time-picker-nav .date-tag {
  margin-right: 32rpx;
}

.date-time-picker-box .date-time-picker-nav .tag {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

.date-time-picker-box .date-time-picker-nav .tag.active {
  color: #1F1E1E;
}

.date-time-picker-box .date-time-picker-nav .date-time-line {
  position: absolute;
  bottom: 0;
  width: 40rpx;
  height: 4rpx;
  background-color: #5C5959;
  transition: all 0.3s linear;
}

.date-picker-btn-box {
  display: flex;
  font-weight: 600;
  margin-top: 40rpx;
  color: var(--themeColor);
  justify-content: space-around;
}

.date-time-picker-content {
  height: 600rpx;
  box-sizing: border-box;
}
  • json 中
{
  "component": true,
  "usingComponents": {
    "van-popup": "@vant/weapp/popup/index",
    "calendar":"./calendar/index"
  }
}
  • js 中
const date = new Date(); // 获取系统日期
var getYear = date.getFullYear(),
  getMonth =
    date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1,
  getDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(),
  isScroll = false;
Component({
  properties: {
    show: {
      // 控制弹窗显示和隐藏
      type: Boolean,
      value: false,
    },
    vertical: {
      // 是否垂直滑动
      type: Boolean,
      value: false,
    },
    /**
     * type 时间类型 分钟, 支持两种类型 time 和 part , 默认是part
     * time : 2023-02-03 09:00  正常的日期时间 (例如: 09:30 、11:10 、12:36 ...)
     * part :  2023-02-03 09:00  分钟只包含 00 和 30 (例如: 09:30 、11:00 、12:30 ...)
     */
    type: {
      type: String,
      value: "part", // time 和 part
    },
  },
  data: {
    year: getYear, // 当前已选年份,默认是当年
    month: getMonth, // 当前已选月份,默认是当月
    day: getDate, // 当前已选天,默认是当天
    hour: "09", // 当前已选小时, 默认 09 点
    minute: "00", // 当前已选分钟,默认00
    hours: [], // 时间选择器,存放的小时数组 0 - 23
    minutes: [], // 时间选择器,存放的分钟数组 00 和 30 或者 00 - 59
    value: [0, 0], // 时间选择器,当前选择时间 索引
    currentIndex: 0, // tab导航当前索引
    left: 0, // tab导航 底部线条 当前离左侧位置 距离
    width: 123, // tab导航 底部线条 当前 宽度
    firstEnter: true, // 是否第一次打开, 默认true
  },
  lifetimes: {
    attached: function () {
      this.initDateTimePicker();
    },
    moved: function () {},
    detached: function () {},
  },
  methods: {
    // 日期改变的回调
    selectDay({ detail }) {
      console.log(detail, "selectDay detail");
      let { year, month, day } = detail;
      month = month > 9 ? month : "0" + month;
      day = day > 9 ? day : "0" + day;
      if (!this.data.firstEnter) {
        setTimeout(() => {
          this.setData({ currentIndex: 1 });
          this.changeline();
        }, 300);
      }
      this.setData({ year, month, day, firstEnter: false });
    },
    // 切换导航
    handleChangeTag(e) {
      this.setData({
        currentIndex: e.currentTarget.dataset.index,
        firstEnter: false,
      });
      this.changeline();
    },
    // 渲染横线位置的方法
    changeline() {
      let _this = this;
      // SelectorQuery.in(Component component): 将选择器的选取范围更改为自定义组件 component 内
      let query = wx.createSelectorQuery().in(this);
      // select() 在当前页面下选择第一个匹配选择器 selector 的节点
      // boundingClientRect() 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位
      query.select(".active").boundingClientRect();
      // SelectorQuery.exec(function callback) 执行所有的请求
      // 请求结果按请求次序构成数组,在callback的第一个参数中返回
      query.exec(function (res) {
        // console.log(res);
        _this.setData({
          left: res && res[0].left - 24,
          width: parseInt(res[0].width),
        });
      });
    },
    /***
     * 滚动选择时触发change事件,
     * 可以查看小程序官方文档了解
     */
    bindChange(e) {
      const val = e.detail.value;
      this.setData({
        hour: this.data.hours[val[0]],
        minute: this.data.minutes[val[1]],
      });
    },
    // 滚动开始
    bindpickstart() {
      isScroll = true;
    },
    //滚动结束
    bindpickend() {
      isScroll = false;
    },
    // 点击取消按钮,关闭日期选择器
    handleCancel() {
      this.setData({ show: false });
    },
    // 点击确定按钮
    handleConfirm() {
      let { year, month, day, hour, minute } = this.data;
      // console.log(year, month, day, hour,  minute)
      // 判断用户选择时间滚动是否结束,解决 picker-view bindChange 延迟问题
      if (isScroll) return;
      const timeStr =
        year + "-" + month + "-" + day + " " + hour + ":" + minute;
      this.triggerEvent("onSelectDate", timeStr);
      this.setData({ show: false, currentIndex: 0 });
      this.changeline();
    },
    // 初始化 picker 时间数据
    initDateTimePicker() {
      let hours = [],
        minutes = [];
      // 存放小时的数组
      for (let i = 0; i <= 23; i++) {
        if (i < 10) {
          i = "0" + i;
        }
        hours.push(i);
      }
      // 存放分钟的数组
      if (this.data.type === 'time') {
        for (let i = 0; i <= 59; i++) {
          if (i < 10) { i = '0' + i }
          minutes.push(i)
        }
      } else {
        minutes = ['00', '30']
      }
      this.setData({ hours, minutes });
      this.setData({ value: [9, 0] });
    },
    // 加载日历数据
    getDateList() {
      // 防止滑动时 tab导航切换到时间模块
      this.setData({ firstEnter: true });
    },
    // 禁止 日期时间 swiper 滑动
    catchtouchmove() {
      return false;
    },
  },
});

简要说明:
在 index.wxml 文件 中 ,会有一个 日历组件
<calendar bindselectDay="selectDay" bindgetDateList="getDateList" vertical="{{vertical}}"></calendar>
这个组件会放在 date-time-picker 组件目录下,这里我就不把代码贴出来了,可以直接去我的远程仓库去拉取。
组件代码仓库地址:Gitee | Github 或者直接复制下面的链接 直接下载代码文章来源地址https://www.toymoban.com/news/detail-789338.html

  • Gitee 远程仓库下载链接
git clone https://gitee.com/junfeng535/wx-date-time-picker.git
  • Github 远程仓库下载链接
git clone https://github.com/junfeng-git/wx-date-time-picker.git

到了这里,关于小程序日期(日历)时间 选择器组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用原生小程序组件Picker自定义日期时间选择器

    1、 Picker简单介绍 可以看到Picker类型有5种, 具体可以查看微信开放文档 picker。 Picker(选择器)是一种常见的用户界面控件,用于从多个选项中选择一个或多个选项。在小程序中,Picker 是一种可用于选择日期、时间、地点等信息的组件。 小程序中的 Picker 组件提供了几种不

    2024年02月09日
    浏览(35)
  • 【Android从零单排系列十一】《Android视图控件——日历、日期、时间选择控件》

    目录 一.日历、日期、时间组件基本介绍 二.几种常见的控件类型 1.CalendarView –日历控件 2. DatePicker –日期选择控件 3.TimePicker –时间选择控件 4.Chronometer—计时器控件 三.DEMO 小伙伴们,在上文中我们介绍了Android视图控件ImageView控件,本文我们继续盘点,介绍一下视图控件的

    2023年04月09日
    浏览(30)
  • 解决微信小程序vant weapp组件库时间选择器只显示年year的问题 vant weapp版本1.10.5

    当今网上十篇文章九个抄,抄的还都是远古文章,完全不适用现在的版本,故于2023.3.10日,出一篇现vant weapp版本1.10.5的时间选择器只显示year模式的需求,解决官方无法显示只带有年份year的时间选择器问题 找到时间选择器文件,修改datetime-picker/index.js源码 1. 先让面板支持只

    2024年02月12日
    浏览(28)
  • Vant-ui图片懒加载教程

    本文详细介绍了如何在Vue项目中使用Vant-ui的图片懒加载功能,包括核心代码的使用和注意事项。具体路径一定要用引号包住,该代码必须在vue下才能正常运行。

    2024年01月22日
    浏览(49)
  • 关于html文件使用vant-ui

    1.引入文件(文件自行下载到本地引入) 2.html文件内容 3.index.js 配置 4.当这些都配置好之后,你就可以对着van-ui的组件库进行使用,比如按钮,你可以直接复制放在id为app的容器内 注意点: vant.js必须在vue.js之后 并且index.js文件,必须new Vue一下 只有在id为#app的容器内使用才有

    2024年02月16日
    浏览(32)
  • 移动端Vant-Ui库以及适配Rem插件

    Vant下载以及使用 看官方文档下载一定要看清楚你要下载的是那个版本的项目 下载完成之后接下就是怎么去使用它 官方文档分三种引入使用 (1).是按需引入需要那个组件引入那个可以减少项目的大小也方便开发 上面分别也有注释首先引入VUE因为我们需要在上面挂在我们所按需

    2024年02月03日
    浏览(43)
  • 自定义日历.element-ui 修改时间选择器样式

    目录 一、自定义日历 二、时间选择样式自定义 先上效果图 已经封装成vue组件,可选择切换年月:  因 element-UI的时间选择器 el-date-picker 是将元素直接挂载到页面的 body 中,而非自身元素下,所以使用  /deep/、 、  ::v-deep  等穿透无法定位到元素。 解决方案: 利用时间选择

    2024年02月12日
    浏览(35)
  • 猿创征文|vue vant-ui数据列表上拉加载更多,下拉刷新功能

    ⭐️⭐️⭐️   作者: 船长在船上 🚩🚩🚩   主页: 来访地址船长在船上的博客 🔨🔨🔨   简介: CSDN前端领域优质创作者,资深前端开发工程师,专注前端开发,在CSDN总结工作中遇到的问题或者问题解决方法以及对新技术的分享,欢迎咨询交流,共同学习。 🔔🔔🔔

    2023年04月12日
    浏览(27)
  • element ui datePick时间日期一段时间,限制选择日期的范围

     时间戳,一天 想限制只能选日期间隔为一年,联合选择器样式不好改,使用俩单独的 有两个办法限制 1.一个在外层使用form通过表单验证控制,出现错误提示(由于是两个单独的组件,触发验证的方式又为单个失去焦点,所以俩组件无法实时更新) 2.用datepick自带的属性di

    2024年02月05日
    浏览(35)
  • jQuery-UI DateTimePicker日期和时间插件,显示日期和时间、只显示日期、只选择时间

    一、引入js、css文件 二、HTML代码 三、显示日期,效果图 四、只选择时间,效果图

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包