<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了微信小程式日期選擇器的具體程式碼,供大家參考,具體內容如下
需求:在小程式開發中,時常會遇到日期選擇器、時間選擇器或者地區選擇器來進行選擇的功能。往往設計圖上面並不是按部就班沿用官方提供那種控制元件樣式來實現顯示,比如:樣式會多樣化、功能會複雜化。這時我們就要自己寫一個適合需求的元件。
下面跟大家分享下我寫的一個自定義日期選擇器元件
首先上效果圖看看:
主要步驟:
第一步:首先自定義選擇器元件需要用到picker-view跟picker-view-column。使用方法如下~
<picker-view indicator-class="picker-indicator" value="{{pickerIndexList}}" bindchange="bindChangeDate"> <picker-view-column> <view wx:for="{{yearList}}" wx:key="index" class="{{pickerIndexList[0]==index?'txt-active':''}}">{{item}}年</view> </picker-view-column> <picker-view-column> <view wx:for="{{monthList}}" wx:key="index" class="{{pickerIndexList[1]==index?'txt-active':''}}">{{item}}月</view> </picker-view-column> <picker-view-column> <view wx:for="{{dayList}}" wx:key="index" class="{{pickerIndexList[2]==index?'txt-active':''}}">{{item}}日</view> </picker-view-column> </picker-view>
第二步:開啟選擇器時就要獲取到當前的年月日,我這裡使用了for遍歷直接生成年份陣列跟月份陣列。注:天數根據年份跟月份動態生成
//獲取當前日期 getCurrentDate: function (e) { var that = this; var yearList = [], monthList = [], dayList = []; for (var i = new Date().getFullYear(); i <= 2050; i++) {//年份 yearList.push(i); } for (var i = 1; i <= 12; i++) {//月份 monthList.push(i); } var myDate = new Date(); var currentYearIndex = yearList.findIndex(o => o == myDate.getFullYear()); var currentMonthIndex = monthList.findIndex(o => o == myDate.getMonth() + 1); var dayList = that.getDayList(currentYearIndex, currentMonthIndex);//天 var currentDayIndex = dayList.findIndex(o => o == myDate.getDate()); var pickerIndexList = that.data.pickerIndexList; pickerIndexList[0] = currentYearIndex; pickerIndexList[1] = currentMonthIndex; pickerIndexList[2] = currentDayIndex; app.globalData.dateIndexList = pickerIndexList; that.setData({ yearList, monthList, dayList, }) },
第三步:在選擇的過程中,選擇器有個改變事件,當年份或者月份改變的時候,天數要隨之變化
//日期選擇改變事件 bindChangeDate: function (e) { var that = this; var pickerColumnList = e.detail.value; that.setData({ dayList: that.getDayList(pickerColumnList[0], pickerColumnList[1]), pickerIndexList: pickerColumnList, }) },
有個樣式的小問題:如選中行背景色寫在picker-view控制元件中,則會出現捲動時背景色也會隨著動,體驗不好。所以我這裡寫了一個預留位置,設定背景色,捲動選擇時背景色就不會受到影響
<!-- 選中行背景色 start--> <view class="top-background"> <view></view> <view></view> <view></view> </view> <!-- 選中行背景色 end-->
下面是全部程式碼~~
wxml:
<!-- 自定義選擇日期層 start --> <view class="date-layer" wx:if="{{isShowDateLayer}}" catchtouchmove="catchTouchMove"> <view class="layer-box"> <view class="box-top"> <!-- 選中行背景色 start--> <view class="top-background"> <view></view> <view></view> <view></view> </view> <!-- 選中行背景色 end--> <picker-view indicator-class="picker-indicator" value="{{pickerIndexList}}" bindchange="bindChangeDate"> <picker-view-column> <view wx:for="{{yearList}}" wx:key="index" class="{{pickerIndexList[0]==index?'txt-active':''}}">{{item}}年</view> </picker-view-column> <picker-view-column> <view wx:for="{{monthList}}" wx:key="index" class="{{pickerIndexList[1]==index?'txt-active':''}}">{{item}}月</view> </picker-view-column> <picker-view-column> <view wx:for="{{dayList}}" wx:key="index" class="{{pickerIndexList[2]==index?'txt-active':''}}">{{item}}日</view> </picker-view-column> </picker-view> </view> <view class="box-bottom"> <button class="btn-confirm" bindtap="bindConfirmDate">確定</button> <button class="btn-cancel" bindtap="bindCancelDate">取消</button> </view> </view> </view> <!-- 選擇日期層 end -->
js:
/** * 頁面的初始資料 */ data: { pickerIndexList: [0, 0, 0],//日期選擇器下標 isShowDateLayer: false,//是否顯示日期彈層 txtDate: '請選擇提貨日期',//選中日期 isSeltDate: false,//是否選擇日期 }, // 截獲豎向滑動 catchTouchMove: function (res) { return true; }, //獲取天數列表 getDayList: function (year, month) { var that = this; var dayList; switch (month + 1) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: dayList = that.getDayNum(31); break; case 4: case 6: case 9: case 11: dayList = that.getDayNum(30); break; case 2: dayList = that.getDayNum((that.data.yearList[year] % 4 == 0 && that.data.yearList[year] % 100 != 0 || that.data.yearList[year] % 400 == 0) ? 29 : 28); break; } return dayList; }, //獲取天數 getDayNum: function (num) { var dayList = []; for (var i = 1; i <= num; i++) { dayList.push(i); } return dayList; }, //開啟選擇日期彈層 bindOpenDateLayer: function (e) { var that = this; var pickerIndexList = that.data.pickerIndexList; that.setData({ isShowDateLayer: !that.data.isShowDateLayer, dayList: that.getDayList(pickerIndexList[0], pickerIndexList[1]), }) }, //日期選擇改變事件 bindChangeDate: function (e) { var that = this; var pickerColumnList = e.detail.value; that.setData({ dayList: that.getDayList(pickerColumnList[0], pickerColumnList[1]), pickerIndexList: pickerColumnList, }) }, //選擇日期彈層確定按鈕 bindConfirmDate: function (e) { var that = this; var pickerIndexList = that.data.pickerIndexList; var txtDate = that.data.yearList[pickerIndexList[0]] + '-' + that.data.monthList[pickerIndexList[1]] + '-' + that.data.dayList[pickerIndexList[2]]; that.setData({ isShowDateLayer: false, pickerIndexList, txtDate, isSeltDate: true, }) }, //選擇日期彈層取消按鈕 bindCancelDate: function (e) { var that = this; var pickerIndexList = that.data.pickerIndexList; that.setData({ isShowDateLayer: !that.data.isShowDateLayer, }) var yearList = that.data.yearList; var monthList = that.data.monthList; var txtDate = that.data.txtDate; var yearIndex = yearList.findIndex(o => o == parseInt(txtDate.slice(0, txtDate.indexOf('-'))));//年份下標 var monthIndex = monthList.findIndex(o => o == parseInt(txtDate.slice(txtDate.indexOf('-') + 1, txtDate.lastIndexOf('-'))));//月份下標 var dayList = that.getDayList(yearIndex, monthIndex);//天數 if (that.data.isSeltDate) {//選擇過日期 if (txtDate == (yearList[pickerIndexList[0]] + '-' + monthList[pickerIndexList[1]] + '-' + dayList[pickerIndexList[2]])) that.setData({ pickerIndexList }) else that.setData({ pickerIndexList: [yearIndex, monthIndex, dayList.findIndex(o => o == parseInt(txtDate.slice(txtDate.lastIndexOf('-') + 1, txtDate.length)))] }) } else {//未選擇過日期 that.setData({ pickerIndexList: app.globalData.dateIndexList, }) } }, //阻止冒泡事件 catchLayer: function (e) { }, //獲取當前日期 getCurrentDate: function (e) { var that = this; var yearList = [], monthList = [], dayList = []; for (var i = new Date().getFullYear(); i <= 2050; i++) {//年份 yearList.push(i); } for (var i = 1; i <= 12; i++) {//月份 monthList.push(i); } var myDate = new Date(); var currentYearIndex = yearList.findIndex(o => o == myDate.getFullYear()); var currentMonthIndex = monthList.findIndex(o => o == myDate.getMonth() + 1); var dayList = that.getDayList(currentYearIndex, currentMonthIndex);//天 var currentDayIndex = dayList.findIndex(o => o == myDate.getDate()); var pickerIndexList = that.data.pickerIndexList; pickerIndexList[0] = currentYearIndex; pickerIndexList[1] = currentMonthIndex; pickerIndexList[2] = currentDayIndex; app.globalData.dateIndexList = pickerIndexList; that.setData({ yearList, monthList, dayList, }) }, /** * 生命週期函數--監聽頁面載入 */ onLoad: function (options) { var that = this; that.getCurrentDate();//獲取當前時間 that.setData({ pickerIndexList: that.data.pickerIndexList }) },
wxss:
/* 日期選擇彈框 start */ .main .date-layer { height: 100%; width: 100%; background: rgba(0, 0, 0, 0.65); position: fixed; top: 0; z-index: 20; } .date-layer .layer-box { position: fixed; bottom: 0; width: 100%; background: #fff; border-top-left-radius: 24rpx; border-top-right-radius: 24rpx; } .date-layer .layer-box .box-top { padding: 30rpx 0; position: relative; } .date-layer .layer-box picker-view { height: 120px; width: 88%; margin: 0 auto; } .date-layer .layer-box .picker-indicator { height: 40px; line-height: 40px; } .date-layer .layer-box picker-view-column view { line-height: 42px; text-align: center; width: 96%; margin: 0 auto; } .date-layer .layer-box .box-top .top-background { height: 80rpx; width: 88%; margin: 0 auto; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: flex; } .layer-box .box-top .top-background view { height: 100%; width: 96%; margin: 0 auto; background: rgba(195, 218, 49, 0.12); border-top: 2rpx solid #D9E87D; border-bottom: 2rpx solid #C3DA31; margin: 0 4rpx; box-sizing: border-box; } .date-layer .layer-box .box-bottom { display: flex; } .date-layer .layer-box .box-bottom button { margin: 0; padding: 0; width: 50%; border-radius: 0; border: none; background: #fff; height: 100rpx; line-height: 100rpx; font-size: 34rpx; border-top: 2rpx solid #D8D8D8; } .date-layer .layer-box .box-bottom .btn-confirm { border-right: 1rpx solid #D8D8D8; color: #C3DA31; } .date-layer .layer-box .box-bottom .btn-cancel { border-left: 1rpx solid #D8D8D8; color: #B1B1B4; } /* 日期選擇彈框 end */
介紹到這裡就可以實現一個不管是自己還是設計圖都想要的選擇器啦
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45