当前位置: 首页 > news >正文

uniapp 日历组件 uni-datetime-picker

背景:

App端需要日历组件,选择年月日,或者年月日时分秒。找到了两种组件,如下:

方式一:

DCloud插件市场的uni-datetime-picker组件,设置为日期时间选择器【datetimerange】,或者日期选择器【daterange】

<uni-datetime-picker

v-model="timeData"

type="datetimerange"

rangeSeparator="至"

:start="minDate"

:end="maxDate"

@change="maskChange"

@maskClick="maskClick"

/>

方式二:

uniapp基础组件的picker组件,设置为日期选择器 mode="date"

<picker 
  mode="date" 
  :value="date" 
  :start="startDate" 
  :end="endDate" 
  @change="bindDateChange">
    <view class="uni-input">{{date}}</view>
</picker>

插件市场有插件uni-datetime-pickeruniapp内置组件picker组件。

一、插件市场uni-datetime-picker组件

效果展示:【由两部分组成:一组件,二点击组件的弹框】

日期选择器:

设置type为:daterange 或者 datetimerange

<uni-datetime-picker 
v-model="timeData" 
type="datetimerange" 
rangeSeparator="至" 
:start="minDate"
:end="maxDate" 
@change="maskChange" 
@maskClick="maskClick"/>

js逻辑层:

<script>
export default {data() {return {timeData: [],minDate: '',maxDate: '',},methods:{formatTime(time, format = "YY-MM-DD hh:mm:ss") {const args = {y: time.getFullYear(),M: time.getMonth() + 1,d: time.getDate(),h: time.getHours(),m: time.getMinutes(),s: time.getSeconds(),};for (const key in args) {const value = args[key];if (value < 10) args[key] = "0" + value;}const dateStr =args.y +"-" +args.M +"-" +args.d +" " +args.h +":" +args.m +":" +args.s;return dateStr;},maskChange(e) {this.timeData = e},maskClick() {},},created() {const maxDate = this.formatTime(new Date(Date.now()))const minDate1 = this.formatTime(new Date(Date.now() - 8.64e7))const minDate7 = this.formatTime(new Date(Date.now() - 8.64e7 * 7))this.minDate = minDate7this.maxDate = maxDatethis.timeData = [minDate1, maxDate]},
}

插件市场官网:点击跳转

下载插件市场的插件,可以通过HBuilder下载,或者下载zip然后导入项目文件夹uni_modules

二、uniapp内置组件

效果展示:

日期选择器:

<picker mode="date" :value="date" :start="minDate" :end="maxDate" @change="bindDateChange"><view class="uni-input">{{date}}</view>
</picker>

js逻辑层:

<script>
export default {data() {const currentDate = this.getDate({format: true})return {title: 'picker',array: ['中国', '美国', '巴西', '日本'],index: 0,date: currentDate,time: '12:01'}},computed: {minDate() {return this.getDate('start');},maxDate() {return this.getDate('end');}},methods: {bindPickerChange: function(e) {console.log('picker发送选择改变,携带值为', e.detail.value)this.index = e.detail.value},bindDateChange: function(e) {this.date = e.detail.value},bindTimeChange: function(e) {this.time = e.detail.value},getDate(type) {const date = new Date();let year = date.getFullYear();let month = date.getMonth() + 1;let day = date.getDate();if (type === 'start') {year = year - 10;} else if (type === 'end') {year = year + 10;}month = month > 9 ? month : '0' + month;day = day > 9 ? day : '0' + day;return `${year}-${month}-${day}`;}}
}
</script>

uniapp组件官网链接:点击跳转

三、自行封装一个日历选择器

背景:

以上两种组件在H5端或者Android端组件的形式有所差异,可根据实际情况进行调整。

以下是自行封装了一个名为MyCalender的组件,组件只能选择具体的某一天。封装它的意图是想要弹出框尽量小,或者日历选择区域尽量小。

效果展示:

  

封装组件思路:

日期选择器只能选择一天。弹框根据实时日期渲染当月的总天数。大于当前日期的不可选并有提示信息,只能选择小于等于当前日期。

封装自定义组件:

<template><view class="MyCalender"><view class="inputBox" @click='toggle()'><u-input :readonly="true" style="pointer-events:none" v-model="inputValue" :placeholder="'请选择一个时间'"suffixIcon="arrow-down" :clearable="true"><!-- <u--text text="视频回放日期:" slot="prefix" margin="0 3px 0 0" type="tips"></u--text> --></u-input></view><!-- <view class="calenderBox" v-if="isOpen"><view class="calender_item" v-for="(item, index) in timeCalender" :key="index" @click="clickCalenderI(item)":class="item === currentD ? 'active' : ''"><view class="calender_item_inner" :class="item > currentDStyle ? 'disabled' : ''">{{ item }}</view></view></view> --><u-popup mode="bottom" :round="20" :show="showPop" :closeOnClickOverlay="false" @close="handlePopup(false)":closeable="true"><view class="pop-title">回放日期</view><view class="calenderBox"><view class="calender_item" v-for="(item, index) in timeCalender" :key="index"@click="clickCalenderI(item)" :class="item === currentD ? 'active' : ''"><view class="calender_item_inner" :class="item > currentDStyle ? 'disabled' : ''">{{ item }}</view></view></view><view class="pop-footer" @click="toggle"><u-button text="点我关闭" type="primary"></u-button></view></u-popup></view>
</template>
<script>
export default {name: "MyCalender",props: {defaultTime: {type: String,default: ''},timeArr: {type: Number,default: 30,}},data() {return {showPop: false,clickData: '',inputValue: '',isOpen: false,timeCalender: 0,currentD: 0,currentDStyle: 0,}},methods: {handlePopup(state) {this.showPop = state;},toggle() {console.log('toggle');this.showPop = !this.showPop},handleOpenOption(data) {console.log('handleOpenOption', data);this.isOpen = !this.isOpen},clickCalenderI(item) {console.log('clickCalenderI', item);this.currentD = item//根据第几天得出日期const whichData = new Date(new Date().getFullYear(), new Date().getMonth(), item)this.clickData = whichDataif (this.clickData > new Date()) {this.clickData = new Date()this.currentD = this.clickData.getDate()uni.showToast({icon: 'none',title: `请重新选择日期,不可大于今日${this.currentD}号`,})} else {this.clickData = this.clickData}const whichData_String = this.clickData.getFullYear() + '-' + (this.clickData.getMonth() + 1) + '-' + this.clickData.getDate()this.inputValue = whichData_Stringthis.$emit('clickCalenderI', this.inputValue)}},created() {//timeCalenderconst currentDate = new Date();const currentY = currentDate.getFullYear();const currentM = currentDate.getMonth() + 1;const currentD = currentDate.getDate();const days = new Date(currentY, currentM, 0).getDate();console.log('days', days);this.timeCalender = days;this.currentDStyle = currentD},watch: {defaultTime: {handler(val) {if (val && val.split(' ').length) {this.inputValue = val.split(' ')[0]}},immediate: true,deep: true}}
}
</script>
<style lang="scss" scoped>
.MyCalender {max-width: 80%;height: 100%;box-sizing: border-box;// padding: 0px 10px;overflow: hidden;background-color: #fff;display: flex;align-items: center;.inputBox {width: 100%;}.calenderBox {width: auto;height: 30vh;display: flex;flex-direction: row;flex-wrap: wrap;overflow-x: scroll;box-sizing: border-box;padding: 20rpx 0rpx 20rpx 20rpx;.active {background-color: #3670EB !important;}.disabled {color: #ccd5e0 !important;}.calender_item {width: 60rpx;height: 60rpx;background-color: #a9a2a2;border-radius: 50%;margin-right: 10px;box-sizing: border-box;padding: 20px;display: flex;justify-content: center;align-items: center;}}
}
</style>
<style lang="scss">
.pop-title {text-align: center;font-size: larger;
}.pop-container {height: 30vh;overflow-x: hidden;overflow-y: auto;
}
</style>

使用自定义的组件:

<MyCalender :defaultTime="maxDate" @clickCalenderI="clickCalenderI"></MyCalender>

//vue2

clickCalenderI(item) {

    console.log('clickCalenderI', item);

    this.timeData = [`${item} 00:00:00`, `${item} 23:59:59`]

},

this.maxDate = this.formatTime(new Date(Date.now()))

formatTime(time, format = "YY-MM-DD hh:mm:ss") {

    const args = {

        y: time.getFullYear(),

        M: time.getMonth() + 1,

        d: time.getDate(),

        h: time.getHours(),

        m: time.getMinutes(),

        s: time.getSeconds(),

    };

    for (const key in args) {

        const value = args[key];

        if (value < 10) args[key] = "0" + value;

    }

    const dateStr =

        args.y +

        "-" +

        args.M +

        "-" +

        args.d +

        " " +

        args.h +

        ":" +

        args.m +

        ":" +

        args.s;

    return dateStr;

},

写到这儿。。。我们就实现了三种uniapp选择日期的方式,根据实际情况自行选择。。。

http://www.dtcms.com/a/423069.html

相关文章:

  • 如何上传网站内容wordpress 文章导出
  • 【2小时轻松部署分布式存储Ceph高可用集群】2-ceph组件-Ceph 组件深度拆解:从底层架构到实战运维的全维度指南
  • 外链都没有的网站如何做排名的摄影设计说明范文
  • STM32H743-ARM例程13-SDIO
  • 求职招聘小程序:轻量化场景下的核心功能解析
  • 玳瑁的嵌入式日记---0929(ARM--ADC)
  • 国外seo做的好的网站wordpress 登陆
  • 东欣建设集团网站设计素材网站上的素材可以商用吗
  • OD C卷 - 有效子字符串
  • 无人机定点派送技术要点与运行方式
  • 实战项目:活动报名小程序-应用内数据库CRUD
  • 从零构建能自我优化的AI Agent:Reflection和Reflexion机制对比详解与实现
  • 能见度监测站的优点是什么
  • 网站建设需要代码哪些网站可以做国外生意
  • 建网站不想用怎样撤销有关于做茗茶的网站
  • PDDA-CY5用于制备荧光标记聚合物、纳米载体或功能化材料
  • 信息安全基础知识:10入侵检测技术
  • 电机控制:前馈与反馈
  • 创网站永久免费建站如何让百度不收录网站
  • Frames:Runway推出的AI图像生成模型,提供前所未有的风格控制和视觉一致性
  • Sentinel 深度解析:限流与熔断降级的微服务稳定性保障实践
  • wordpress 网站图标软件开发一个月多少工资
  • 计算机视觉(opencv)——基于 dlib 人脸对齐
  • 古代游戏中的社交密码
  • (免费分享)基于python的飞机大战游戏
  • 虚幻引擎UE5专用服务器游戏开发-21 连招技能动画蒙太奇播放
  • 洛阳市建设厅网站网站优化布局
  • 20250929给PRO-RK3566开发板在Buildroot系统下裁剪内核【已关闭摄像头ov4689为例子】
  • Python 豆瓣TOP250 爬虫类讲解
  • 建一个网站迈年广电基础设施建设官方网站