返回顶部
首页 > 资讯 > 前端开发 > JavaScript >微信小程序自定义时间段picker选择器
  • 609
分享到

微信小程序自定义时间段picker选择器

2024-04-02 19:04:59 609人浏览 薄情痞子
摘要

本文实例为大家分享了微信小程序自定义时间段picker选择器的具体代码,供大家参考,具体内容如下 想实现一个可以选择年份和时间段的日期选择器,如下所示 微信小程序自带的picker

本文实例为大家分享了微信小程序自定义时间段picker选择器的具体代码,供大家参考,具体内容如下

想实现一个可以选择年份和时间段的日期选择器,如下所示

微信小程序自带的picker组件虽然能实现如上的内容,但不能实现样式的修改,不太符合小程序的设计主题,所以考虑了以下两种方法来实现如上的设计。

1.自定义date-picker

把要实现的date-picker封装为一个组件,组件内套用小程序自带的picker-view组件,其中picker_view-column表示不同的选择列,这样可以方便地实现样式的自定义。

实现效果:

具体实现

wxml文件:

<view class="mask" wx:if="{{isshow}}" catchtap="cancel">
  <view class="content" style="height:800rpx" animation="{{animation}}">
    <view class="top">
      <view class="top-text top-left-color" hover-class="top-left-color-hover" catchtap="cancel">取消</view>
      <view class="top-text top-right-color" hover-class="top-right-color-hover" catchtap="confirm">确定</view>
    </view>
    <picker-view style="width: 100%; height: 80%;" value="{{value}}" bindchange="change" catchtap="no">
      <picker-view-column>
        <view wx:for="{{date_list}}" wx:key="date_list" class="item">{{item}}</view>
      </picker-view-column>
      <picker-view-column>
        <view wx:for="{{time_list}}" wx:key="time_list" class="item">{{item}}</view>
      </picker-view-column>
    </picker-view>
  </view>
</view>

wxss文件:

.mask {
  position: fixed;
  width: 100%;
  height: 100%;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  display: flex;
  background-color: rgba(0, 0, 0, 0.7);
  z-index: 9999;
  flex-direction: column;
  justify-content: flex-end;
}

.content {
  display: flex;
  flex-direction: column;
  width: 100%;
  background: white;
  border-top-right-radius: 20rpx;
  border-top-left-radius: 20rpx;
}

.top {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  align-items: center;
  height: 100rpx;
  border-bottom: 1rpx solid #d3cfcf;
}

.top-text {
  font-size: 30rpx;
  width: 150rpx;
  height: 100rpx;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}

.top-left-color {
  color: #878787;
}

.top-left-color-hover {
  color: #f1eaea;
}

.top-right-color {
  color: #1296DB;
}

.top-right-color-hover {
  color: #82ccf3;
}

.item {
  width: 100%;
  align-items: center;
  justify-content: center;
  display: flex;
  flex-direction: row;
  font-size: 18px;
}
Component({
    
    properties: {
        range: { //可预约的日期范围。默认日期从今天开始,到第range天后为止,这里设为10天
            type: Number,
            value: 10
        },
        start_time: { //开始时间,设为整点
            type: Number,
            value: 8
        },
        step: { //预约时间的步长,设置为30,表示30分钟
            type: Number
        },
        end_time: { //结束时间,设为整点
            type: Number,
            value: 22
        }
    },

    
    data: {
        isShow: false,
        selectDate: "",
        dialogh: 0,

        //日期列表和时间列表
        date_list: [],
        time_list: []
    },
    attached: function () {
        let start_day = this.ts_string(new Date().getTime());
        console.log(start_day); //2021-08-31
        console.log(new Date());
        let end_day = this.ts_string(new Date().setDate(new Date().getDate() + this.properties.range))
        //获取日期列表
        let date_list = this.getDiffDate(start_day, end_day);
        //获取时间列表
        let time_list = this.getTimeList(this.properties.start_time, this.properties.end_time, this.properties.step);
        console.log(time_list);
        this.setData({
            // date_time: [date_column, time_column],
            date_list: date_list,
            time_list: time_list,
        })
        //动画
        this.animation = wx.createAnimation({
            duration: 300
        })
        //500rpx转成px
        let dialoghpx = 800 / 750 * wx.getSystemInfoSync().windowWidth
        this.setData({
            dialogh: dialoghpx,
            selectDate: this.data.date_list[0] + this.data.time_list[0]
        })
    },
    methods: {
        getDiffDate(start, end) {
            let startTime = new Date(start);
            let endTime = new Date(end);
            let dateArr = [];
            while ((endTime.getTime() - startTime.getTime()) >= 0) {
                dateArr.push(this.ts_string(startTime.getTime()));
                startTime.setDate(startTime.getDate() + 1);
            }
            return dateArr;
        },
        zfill(num, length) {
            return (Array(length).join('0') + num).slice(-length);
        },
        //把日期转换成xxxx-xx-xx的形式
        ts_string(timestamp) {
            let d = new Date(timestamp);
            let day = "";
            switch (d.getDay()) {
                case 1:
                    day = "周一";
                    break;
                case 2:
                    day = "周二";
                    break;
                case 3:
                    day = "周三";
                    break;
                case 4:
                    day = "周四";
                    break;
                case 5:
                    day = "周五";
                    break;
                case 6:
                    day = "周六";
                    break;
                case 0:
                    day = "周日";
                    break;
            }
            let string = (d.getFullYear()) + "-" +
                this.zfill((d.getMonth() + 1), 2) + "-" +
                this.zfill((d.getDate()), 2) + " (" + day + ")"
            return string
        },
        //获取时间区间列表,输入(起始时间,结束时间,步长)
        getTimeList(start, end, step) {
            let start_time = new Date();
            //设置起始时间
            start_time.setHours(start, 0, 0);
            console.log(start_time);
            //设置结束时间
            let end_time = new Date();
            end_time.setHours(end, 0, 0);
            let startG = start_time.getTime(); //起始时间的格林时间
            let endG = end_time.getTime(); //起始时间的格林时间
            let step_ms = step * 60 * 1000;
            let timeArr = [];
            while (startG < endG) {
                let time = this.timeAdd(startG, step_ms);
                timeArr.push(time);
                startG += step_ms;
            }

            return timeArr;
        },
        timeAdd(time1, add) {
            var nd = new Date(time1); //创建时间对象
            //获取起始时间的时分秒
            var hh1 = nd.getHours();
            var mm1 = nd.getMinutes();
            if (hh1 <= 9) hh1 = "0" + hh1;
            if (mm1 <= 9) mm1 = "0" + mm1;
            nd = nd.valueOf(); //转换为毫秒数
            nd = nd + Number(add);
            nd = new Date(nd);
            var hh2 = nd.getHours();
            var mm2 = nd.getMinutes();
            if (hh2 <= 9) hh2 = "0" + hh2;
            if (mm2 <= 9) mm2 = "0" + mm2;
            var time = hh1 + ":" + mm1 + "-" + hh2 + ":" + mm2;
            return time; //时间段
        },
        change: function (e) {
            const val = e.detail.value;
            //val[0]表示选择的第一列序号,val[1]表示选择的第二列序号
            let select = this.data.date_list[val[0]] + this.data.time_list[val[1]]
            console.log(select);
            this.setData({
                selectDate: select
            })

        },
        showDialog() {
            this.setData({
                isShow: true
            })
            //先向下移动dialog高度,然后恢复原位从而形成从下向上弹出效果
            this.animation.translateY(this.data.dialogh).translateY(0).step()
            this.setData({
                animation: this.animation.export()
            })
        },
        dimsss() {
            //从原位向下移动dailog高度,形成从上向下的收起效果
            this.animation.translateY(this.data.dialogh).step()
            this.setData({
                animation: this.animation.export()
            })
            //动画结束后蒙层消失
            setTimeout(() => {
                this.setData({
                    isShow: false
                })
            }, 300)
        },
        cancel() {
            this.triggerEvent("cancel")
            this.dimsss()
        },
        confirm() {
            this.triggerEvent("confirm", {
                selectDate: this.data.selectDate
            })
            this.dimsss()
        }
    }
})

组件的使用

想在父组件中使用封装好的date-picker组件,先要在父组件的JSON文件中声明。

{
  "usinGComponents": {
    "date-picker": "../../components/date-picker/date-picker"
  },
}

如果想实现简单的选择时间段并在页面中显示的功能,父组件代码如下编写即可。
父组件wxml文件:

<view class="option" bindtap="timeOpen" style="font-size: 16px;">
      {{selectDate}}
</view>
<date-picker id="picker" range="8" step="40" bindconfirm="confirm"></date-picker>

父组件js文件:

Page({
    data: {
        selectDate: "",
        MachineShow: false,
    },
    onLoad: function () {
        this.picker = this.selectComponent("#picker")
    },
    timeOpen() {
        this.picker.showDialog();
    },
    confirm(e) {
        this.setData({
            selectDate: e.detail.selectDate
        })
    },
})

2.结合vant weapp的date-picker

自定义定义的date-picker组件已经可以实现想实现的功能,但自定义的组件样式不够美观。这时,我注意到了小程序可以使用vant的组件库,组件库多列选择器的样式可以自由修改,而且自带样式已经足够美观,所以下面考虑结合vant组件库实现date-picker。

实现效果

具体实现

使用vant weapp的picker组件和popup组件可以更简洁地实现想要的效果,打造自定义的date-picker组件。

首先需要在编写组件的json文件中导入vant weapp的相应组件

{
    "component": true,
    "usingComponents": {
        "van-picker": "@vant/weapp/picker/index",
        "van-popup": "@vant/weapp/popup/index"
    }
}

然后编写date-picker的wxml文件:

<van-popup round show="{{ isShow }}" bind:close="cancel" position="bottom" custom-style="height: 55%">
  <van-picker show-toolbar columns="{{ date_time_list }}" bind:cancel="cancel" bind:change="change"
    bind:confirm="confirm" />
</van-popup>

因为van-picker的参数columns接受的是一个对象数组,与picker-view有一定差异,所以需要将date-picker的js文件进行如下更改。

1.修改data,增加date_time_list

data: {
        isShow: false,
        selectDate: "",
        dialogh: 0,

        //日期列表和时间列表
        date_list: [],
        time_list: [],
        date_time_list: []  //增加的字段
    },

2.修改attached函数

//增加的内容
let date_time_list = [{
                values: date_list
            },
            {
                values: time_list  
            }
        ];
        this.setData({
            date_list: date_list,
            time_list: time_list,
            date_time_list: date_time_list  //增加的内容
        })

3.修改change函数

change: function (e) {
            let val = e.detail.value;
            let select = val[0] + val[1];
            this.setData({
                selectDate: select
            })

        },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 微信小程序自定义时间段picker选择器

本文链接: https://lsjlt.com/news/154031.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 微信小程序自定义时间段picker选择器
    本文实例为大家分享了微信小程序自定义时间段picker选择器的具体代码,供大家参考,具体内容如下 想实现一个可以选择年份和时间段的日期选择器,如下所示 微信小程序自带的picker...
    99+
    2024-04-02
  • 微信小程序自定义滚动选择器
    本文实例为大家分享了微信小程序自定义滚动选择器的具体代码,供大家参考,具体内容如下 最近项目里有个需求要做个滚动选择器,在网上找了半天也没找到合适的demo,没办法只能发挥我的聪明才...
    99+
    2024-04-02
  • 微信小程序自定义日期选择器
    日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器 今天给大家带来一个自定义的时间选择器,废话不多说,直接上代码 第一步:先创建一个picker的...
    99+
    2024-04-02
  • 使用原生小程序组件Picker自定义日期时间选择器
    使用原生小程序组件Picker自定义日期时间选择器 1、 Picker简单介绍 可以看到Picker类型有5种, 具体可以查看微信开放文档 picker。 Picker(选择器)是一种常见的用户界面控...
    99+
    2023-09-14
    小程序
  • 微信小程序怎么自定义滚动选择器
    这篇文章主要介绍“微信小程序怎么自定义滚动选择器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么自定义滚动选择器”文章能帮助大家解决问题。js:// pages/xuanzeq...
    99+
    2023-07-02
  • 微信小程序如何自定义多列选择器
    今天小编给大家分享一下微信小程序如何自定义多列选择器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项目需要,需要实现一个多列...
    99+
    2023-07-02
  • 微信小程序自定义多列选择器使用
    本文实例为大家分享了微信小程序自定义多列选择器的具体代码,供大家参考,具体内容如下 项目需要,需要实现一个多列选择器,在用户确定之前,无论列表如何转,都不会影响已确定值的显示,只要用...
    99+
    2024-04-02
  • 微信小程序picker多列选择器(mode = multiSelector)
    目录一、效果图(多列)二、普通选择器:mode = selector、多列选择器:mode = multiSelector三、app.json四、picker.wxml五、picke...
    99+
    2024-04-02
  • 微信小程序picker选择器怎么实现
    本篇内容主要讲解“微信小程序picker选择器怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序picker选择器怎么实现”吧!picker选择器分为三种,普通选择器,时间选择器,...
    99+
    2023-06-26
  • 微信小程序实现时间选择
    本文实例为大家分享了微信小程序实现时间选择的具体代码,供大家参考,具体内容如下  xml:  <view class="day-check" style=...
    99+
    2024-04-02
  • 微信小程序picker多列选择器怎么用
    本篇内容主要讲解“微信小程序picker多列选择器怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序picker多列选择器怎么用”吧!vue-next-admin,这是基于 vue3...
    99+
    2023-06-08
  • 微信小程序自定义复选框
    本文实例为大家分享了微信小程序自定义复选框的具体代码,供大家参考,具体内容如下 1、效果  2、wxml <checkbox-group bindchange="c...
    99+
    2024-04-02
  • 微信小程序当前时间时段选择器插件怎么用
    这篇文章给大家分享的是有关微信小程序当前时间时段选择器插件怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下DEMO效果图插件思路准备工作获取当前时间,同时获取当前...
    99+
    2024-04-02
  • 微信小程序选择器组件picker怎么使用
    本篇内容介绍了“微信小程序选择器组件picker怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!picker组件的定义picker组件...
    99+
    2023-07-05
  • 微信小程序选择器组件picker简单入门
    目录picker组件的定义picker组件的类型picker属性共同的属性时间选择器time参考补充:遇到的问题总结picker组件的定义 picker组件是一种从底部向上弹起的滚动...
    99+
    2023-03-02
    微信小程序picker 微信小程序 选择器 小程序选择器
  • 微信小程序自定义计时器功能
    最近想在在做的微信小程序加一个计时器功能,就是可以设置一个时间,可以开始倒计时,暂停,最终实现结果(图1,2所示),可能这个配色及样式有点糟糕毕竟css太难了 ,可以在这个基础上进行...
    99+
    2024-04-02
  • 微信小程序如何自定义可搜索的picker组件
    本篇内容介绍了“微信小程序如何自定义可搜索的picker组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码:myPicker.wxml&...
    99+
    2023-07-02
  • 微信小程序中怎么自定义一个多列选择器
    这篇文章给大家介绍微信小程序中怎么自定义一个多列选择器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在.wxml建一个自定义picker组件:<picker  &nbs...
    99+
    2024-04-02
  • 微信小程序自定义日期选择器的示例分析
    这期内容当中小编将会给大家带来有关微信小程序自定义日期选择器的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。日期选择器是我们在写项目的过程中经常遇到的,有需要标题的选择器,也有不需要标题的选择器今...
    99+
    2023-06-26
  • uniapp 小程序 picker 日期时间段选择(精确到年月日时分)
    效果图: picker时间段选择 需要引入moment.js,有可能引入后在项目内会报错,可以考虑把选择日期作为一个组件引入 timepage.vue组件封装 请选择{{momen...
    99+
    2023-09-08
    uni-app 小程序 微信小程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作