赞
踩
这里写自定义目录标题
微信小程序--多种类型日期选择器(年月、月日...)
时间选择器(年月日)
时间选择器(年月)
时间选择器(年)
时间选择器(月日)
时间选择器(月)
时间选择器(日)
微信小程序–多种类型日期选择器(年月、月日…)
在业务开发的过程中,有许多对picker选择器的使用场景,根据开发需要列出了几种常见的类型,可供大家共同参考、学习
时间选择器(年月日)
效果图:
wxml:
- <picker mode="date" header-text="选择时间" value="{{date}}" bindchange="bindDateChange">
- <view class="font30">
- <text class="color3">填报时间:</text>
- <text class="color6">{{date}}</text>
- <text class="timeIcon">▼</text>
- </view>
- </picker>
js
- data:{
- date:'2021-01-01',
- },
- bindDateChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.setData({
- date: e.detail.value
- })
- },
wxss
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
效果图:
wxml:
- <picker mode="date" header-text="选择时间" fields="month" value="{{date}}" bindchange="bindDateChange">
- <view class="font30">
- <text class="color3">填报时间:</text>
- <text class="color6">{{date}}</text>
- <text class="timeIcon">▼</text>
- </view>
- </picker>
js
- data:{
- date:'2021-01',
- },
- bindDateChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.setData({
- date: e.detail.value
- })
- },
wxss
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
wxml:
- <picker mode="date" header-text="选择时间" fields="year" value="{{date}}" bindchange="bindDateChange">
- <view class="font30">
- <text class="color3">填报时间:</text>
- <text class="color6">{{date}}</text>
- <text class="timeIcon">▼</text>
- </view>
- </picker>
js
- data:{
- date:'2021',
- },
- bindDateChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.setData({
- date: e.detail.value
- })
- },
wxss
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
(转载文章 如有雷同 纯属巧合)
这个官方没有给案例 只能自己自定义一个component组件(datePicker)
datePicker.wxml:
- <view class='modal-mask' wx:if="{{ showDatePickerPlus }}" bindtap='closeDatePickerPlus'></view>
- <view class='datepicker' wx:if="{{ showDatePickerPlus }}" animation="{{animationData}}">
- <view class='datepicker-header'>
- <view class='datepicker-header-left' bindtap='closeDatePickerPlus'>取消</view>
- <view class='datepicker-header-right' bindtap='submitSelectDate'>确定</view>
- </view>
- <view class='datepicker-content'>
- <picker-view value="{{glDateNoYearMutiIndex}}" bindchange="bindDateGlNoYear">
- <picker-view-column class="picker-view-column">
- <view wx:for="{{glMonthsNoYear}}" wx:key="index">{{item}}月</view>
- </picker-view-column>
- <picker-view-column class="picker-view-column">
- <view wx:for="{{glDaysNoYear}}" wx:key="index">{{item}}日</view>
- </picker-view-column>
- </picker-view>
- </view>
- </view>
datePicker.js:
- // component/DatePicker/DatePicker.js
-
- // 公历日期 1900年 - 今天
- const glYear = [];
- for (let i = 1900; i <= 2049; i++) {
- glYear.push(i)
- }
- // 公历月份
- const glMonth = [];
- for (let i = 1; i <= 12; i++) {
- glMonth.push(i < 10 ? ('0' + i) : i)
- }
- // 公历天份 28天
- const glDay28 = [];
- for (let i = 1; i <= 28; i++) {
- glDay28.push(i < 10 ? ('0' + i) : i)
- }
- // 公历天份 29天
- const glDay29 = [];
- for (let i = 1; i <= 29; i++) {
- glDay29.push(i < 10 ? ('0' + i) : i)
- }
- // 公历天份 30天
- const glDay30 = [];
- for (let i = 1; i <= 30; i++) {
- glDay30.push(i < 10 ? ('0' + i) : i)
- }
- // 公历天份 31天
- const glDay31 = [];
- for (let i = 1; i <= 31; i++) {
- glDay31.push(i < 10 ? ('0' + i) : i)
- }
-
- /**
- * 公历年月日处理
- */
- function glDateHandler(arr) {
- let indexArr = arr
- let data = {
- "yearCol": glYear,
- "monthCol": glMonth,
- "dayCol": []
- }
- if (arr[1] == 0 || arr[1] == 2 || arr[1] == 4 || arr[1] == 6 || arr[1] == 7 || arr[1] == 9 || arr[1] == 11)
- data.dayCol = glDay31
- else if (arr[1] != 1)
- data.dayCol = glDay30
- else {
- let year = glYear[arr[0]];
- data.dayCol = glDay28;
- // 判断闰年
- if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
- data.dayCol = glDay29;
- }
- }
- return data;
- }
-
-
- /**
- * 公历月日处理 不带年份
- */
- function glDateHandlerNoYear(arr) {
- let indexArr = arr
- let data = {
- "monthCol": [],
- "dayCol": []
- }
- data.monthCol = glMonth
- if (arr[0] == 0 || arr[0] == 2 || arr[0] == 4 || arr[0] == 6 || arr[0] == 7 || arr[0] == 9 || arr[0] == 11)
- data.dayCol = glDay31
- else if (arr[0] != 1)
- data.dayCol = glDay30
- else
- data.dayCol = glDay29
- return data;
- }
-
- const formatTime = date => {
- const year = date.getFullYear()
- const month = date.getMonth() + 1
- const day = date.getDate()
- return [year, month, day].map(formatNumber).join('-')
- }
-
- const formatNumber = n => {
- n = n.toString()
- return n[1] ? n : '0' + n
- }
-
- Component({
- behaviors: [],
- properties: {
- // 控制是否显示日期选择组件的flag
- showDatePickerPlus: {
- type: Boolean, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
- value: false, // 属性初始值(可选),如果未指定则会根据类型选择一个
- // 属性被改变时执行的函数(可选),也可以写成在methods段中定义的方法名字符串, 如:'_propertyChange'
- observer: function (newVal, oldVal) {
- if (newVal != oldVal) {
- if (newVal)
- this.showDatePickerPlus()
- else
- this.closeDatePickerPlus()
- }
- }
- },
- initDate: {
- type: String,
- value: formatTime(new Date())
- }
- },
- // 私有数据,可用于模版渲染
- data: {
- glDateMutiIndex: [90, 0, 0],
- glDateNoYearMutiIndex: [0, 0],
- glYears: [],
- glMonths: [],
- glMonthsNoYear: [],
- glDays: [],
- glDaysNoYear: [],
- animationData: {},// 动画
- showDatePickerPlus: false,
- },
-
- // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
- attached: function () {
- /**
- * 初始化阴阳历数据
- */
- let glDateMutiIndex = this.data.glDateMutiIndex;
- let glDateNoYearMutiIndex = this.data.glDateNoYearMutiIndex;
- let [y,m,d] = this.data.initDate.split('-');
- glDateMutiIndex = [glYear.indexOf(parseInt(y)), parseInt(m) - 1, parseInt(d) - 1];
- let glDate = glDateHandler(glDateMutiIndex);
- glDateNoYearMutiIndex = [parseInt(m) - 1, parseInt(d) - 1];
- let glDateNoYear = glDateHandlerNoYear(glDateNoYearMutiIndex);
- this.setData({
- glDateMutiIndex: glDateMutiIndex,
- glDateNoYearMutiIndex: glDateNoYearMutiIndex,
- glYears: glDate.yearCol,
- glMonths: glDate.monthCol,
- glDays: glDate.dayCol,
- glMonthsNoYear: glDateNoYear.monthCol,
- glDaysNoYear: glDateNoYear.dayCol,
- })
- },
- moved: function () {
- },
- detached: function () {
- },
-
- methods: {
- /**
- * 公历数据改变监听
- */
- bindDateGl: function (e) {
- let value = e.detail.value;
- let data = glDateHandler(value);
- this.setData({
- glDateMutiIndex: value,
- glYears: data.yearCol,
- glMonths: data.monthCol,
- glDays: data.dayCol,
- })
- },
- /**
- * 公历不带年份数据改变监听
- */
- bindDateGlNoYear: function (e) {
- let value = e.detail.value;
- let data = glDateHandlerNoYear(value);
- this.setData({
- glDateNoYearMutiIndex: value,
- glMonthsNoYear: data.monthCol,
- glDaysNoYear: data.dayCol
- })
- },
- /**
- * 选择日期->确定
- */
- submitSelectDate: function () {
- let date = '';
- date = (this.data.glMonths[this.data.glDateNoYearMutiIndex[0]] + '-' + this.data.glDaysNoYear[this.data.glDateNoYearMutiIndex[1]])
-
- this.closeDatePickerPlus();
- var myEventDetail = {
- dateStr: date,
- } // detail对象,提供给事件监听函数
- var myEventOption = {} // 触发事件的选项
- this.triggerEvent('submit', myEventDetail, myEventOption)
- },
- // 显示日期选择控件
- showDatePickerPlus: function () {
- var animation = wx.createAnimation({
- duration: 160,
- timingFunction: 'linear',
- delay: 0
- })
- this.animation = animation
-
- animation.translateY(280).step({duration: 0})
-
- this.setData({
- animationData: animation.export(),
- showDatePickerPlus: true
- })
- setTimeout(function () {
- animation.translateY(0).step()
- this.setData({
- animationData: animation.export(),
- })
- }.bind(this), 160)
- },
- // 隐藏日期选择控件
- closeDatePickerPlus: function () {
- this.animation.translateY(280).step()
- this.setData({
- animationData: this.animation.export(),
- })
- setTimeout(function () {
- this.setData({
- showDatePickerPlus: false,
- })
- }.bind(this), 120)
- },
- onMyButtonTap: function () {
- this.setData({
- // 更新属性和数据的方法与更新页面数据的方法类似
- })
- },
- _propertyChange: function (newVal, oldVal) {
-
- }
- }
-
- })
-
datePicker.JSON:
- {
- "component": true,
- "usingComponents": {}
- }
- /* component/DatePicker/DatePicker.wxss */
- /* 日期选择器 */
- .modal-mask {
- width: 100%;
- height: 100%;
- position: fixed;
- top: 0;
- left: 0;
- background: #000;
- opacity: 0.3;
- overflow: hidden;
- z-index: 500;
- color: #fff;
- }
- .datepicker {
- position: fixed;
- bottom: 0;
- left: 0;
- width: 100%;
- background: #fff;
- z-index: 501;
- }
- .datepicker-header {
- display: flex;
- height: 80rpx;
- background-color: #e9e9e9;
- color: #2f80f2;
- align-items: center;
- justify-content: space-between;
- font-size: 28rpx;
- }
- .datepicker-header-left {
- height: 100%;
- margin-left: 30rpx;
- display: flex;
- align-items: center;
- }
- .datepicker-header-right {
- margin-right: 40rpx;
- }
- .datetype-toggle {
- background: #fff;
- border: 1rpx solid #2f80f2;
- display: flex;
- margin-right: 50rpx;
- }
- .datetype-item {
- width: 80rpx;
- height: 50rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- .datetype-select {
- background: #2f80f2;
- color: #fff;
- }
- .datepicker-content {
- height: 100%;
- }
- picker-view {
- width: 100%;
- height: 480rpx;
- }
- .picker-view-column {
- text-align:center;
- line-height: 80rpx;
- color: #222;
- font-size: 28rpx;
- }
index.wxml
- <view class="font30 holidaysTime" bindtap='showDatePickerPlus'>
- <text class="color3">选择时间:</text>
- <text class="color6">{{dateInfo.dateStr}}</text>
- <text class="timeIcon">▼</text>
- <datepicker-plus bind:submit='submit' showDatePickerPlus='{{show}}' initDate="2018-01-01"></datepicker-plus>
- </view>
index.js
- data:{
- show: false,
- dateInfo: {dateStr:'01-01'}
- },
- submit: function(e) {
- console.log(e);
- console.log('日期字符串:' + e.detail.dateStr)
- this.setData({
- dateInfo: e.detail
- })
- console.log('dateInfo',e.detail);
- },
- showDatePickerPlus: function() {
- this.setData({
- show: true
- })
- },
-
index.JSON
- "usingComponents": {
- "datepicker-plus": "/component/DatePicker/DatePicker"
- },
index.WXSS
- .holidaysTime{
- margin-bottom: 60rpx;
- }
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
效果图:
wxml:
- <picker bindchange="bindPickerdateChange" value="{{index}}" range="{{monthArr}}">
- <view class="font30">
- <text class="color3 margin10">月份</text>
- <text class="color6">{{monthArr[index]}}</text>
- <text class="color6 timeIcon">▼</text>
- </view>
- </picker>
js
- data:{
- index:0,
- monthArr:['01月','02月','03月','04月','05月','06月','07月','08月','09月','10月','11月','12月'],
- },
- bindDateChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.setData({
- date: e.detail.value
- })
- },
wxss
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
效果图:
wxml:
- <picker bindchange="bindPickerdateChange" value="{{index}}" range="{{dayArr}}">
- <view class="font30">
- <text class="color3 margin10">日期</text>
- <text class="color6">{{dayArr[index]}}</text>
- <text class="color6 timeIcon">▼</text>
- </view>
- </picker>
js
- data:{
- index:0,
- dayArr:['01日','02日','03日','04日','05日','06日','07日','08日','09日','10日','11日','12日','13日','14日','15日','16日','17日','18日','19日','20日','21日','22日','23日','24日','25日','26日','27日','28日','29日','20日','21日'],
- },
-
- bindPickerdateChange: function(e) {
- console.log('picker发送选择改变,携带值为', e.detail.value)
- this.setData({
- index: e.detail.value
- })
- },
wxss
- .font30{
- font-size: 30rpx;
- }
-
- .color3{
- color: #333;
- }
-
- .color6{
- color: #666;
- }
-
- .timeIcon{
- color:#666;
- font-size:18rpx;
- margin-left: 5rpx;
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。