<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
開發微信小程式過程中,有個需求需要用到日期時間篩選器,檢視微信官方檔案後,發現官方檔案的picker篩選器只能單獨支援日期或者是時間,所以為了實現需求自己參考企業微信封裝了個日期時間篩選器元件。
篩選器的實現,我參考的是小程式官方方式,通過半屏彈窗(mp-half-screen-dialog)結合picker_view進行日期、時間的選擇,最終在選擇時間後,通過事件觸發返回一個change事件,其中引數值為毫秒級時間戳。
1.彈窗的顯隱:
在元件的 properties 中傳入一個 show 欄位,用於控制彈窗的顯隱;預設值為 false。
2.篩選器型別:
為了更好的相容性,提供一個 type 欄位,用於控制篩選器的所支援 可選擇日期 的走向(往前、往後、前後都支援);預設值為 center(前後都支援)。
3.時間區間(年):
year 欄位用於控制篩選器的年維度時間區間範圍;預設值為 1。
4.時間區間(月):
month 欄位用於控制篩選器的月維度時間區間範圍。預設值為 ‘undefined’****(宣告’month’ 不為undefined時 year失效)。
具體思路:整體思路是監聽彈窗的顯隱(show),當彈窗顯示時,獲取對應設定項(型別、年、月)計算對應篩選器的範圍,並初始化預設日期時間為當前年月日時分。
以下是效果圖以及具體程式碼實現:
wxml程式碼
<mp-half-screen-dialog show="{{ show }}" maskClosable="{{ true }}" closabled="{{ false }}" extClass="f-date-dialog" catchtouchmove="preventTouchMove" bindclose="bindclose"> <view slot="desc" class="flex column full-width full-height"> <view class="bd flex full-width"> <!-- 日期 --> <view class="flex1 flex column align-items-center"> <picker-view indicator-style="height: 50px;" mode="selector" value="{{ [dateIndex] }}" class="selector__picker" bindchange="dateChange"> <picker-view-column> <view wx:for="{{ dateArr }}" wx:key="index" style="line-height: 50px" class="text-center {{ item.name.length < 10 ? 'h4' : 'h6' }}">{{ item.name }}</view> </picker-view-column> </picker-view> </view> <!-- 小時 --> <view class="flex1 flex column align-items-center"> <picker-view indicator-style="height: 50px;" mode="selector" value="{{ [hourValue] }}" class="selector__picker" bindchange="hourChange"> <picker-view-column> <view wx:for="{{ hourArr }}" wx:key="index" style="line-height: 50px" class="text-center">{{ item }}</view> </picker-view-column> </picker-view> </view> <!-- 分鐘 --> <view class="flex1 flex column align-items-center"> <picker-view indicator-style="height: 50px;" mode="selector" value="{{ [minValue] }}" class="selector__picker" bindchange="minChange"> <picker-view-column> <view wx:for="{{ minArr }}" wx:key="index" style="line-height: 50px" class="text-center">{{ item }}</view> </picker-view-column> </picker-view> </view> </view> <view class="ft flex align-items-center justify-content-space-between"> <button type="default" style="width:45%;height: 40px;" class="weui-btn" bindtap="bindclose">取消</button> <button type="primary" style="width:45%;height: 40px;margin-top:0" class="weui-btn" bindtap="handleSubmit">確定</button> </view> </view> </mp-half-screen-dialog>
js程式碼
const utils = require('../../utils/util') Component({ options: { addGlobalClass: true }, properties: { show: { type: Boolean, value: false, observer: '_showChange' }, type: { type: String, value: 'center' // 型別:'left' -- 現在往前 'center' -- 往前&往後 'right' -- 現在往後 }, year: { type: Number, value: 1 // '時間區間{year}年' month不為undefined時該項失效 }, month: { type: [Number, String], value: 'undefined' // 'month' 不為undefined時 year失效 } }, data: { dateIndex: null, hourValue: '', minValue: '', dateArr: [], hourArr: [], minArr: [], activeTime: null // 丟擲的時間戳 }, methods: { _showChange(e) { if (e) { this.handleDateData() this.initData() } }, handleSubmit() { this.bindclose() this.triggerEvent('change', { value: this.data.activeTime }) }, initData() { const now = +new Date() const index = this.data.dateArr.map(v => v.name).indexOf(utils.formatTime(now, '{m}月{d}日周{a}')) let tmp = this.data.dateArr tmp[index].name = '今天' this.setData({ dateIndex: index, hourValue: utils.formatTime(now, '{h}'), minValue: utils.formatTime(now, '{i}'), dateArr: tmp, activeTime: now }) }, handleDateData() { const nowYear = new Date().getFullYear() let mins = [] let hours = [] let dates = [] // 獲取小時、分鐘陣列 for (let i = 0; i < 60; i++) { mins.push(i.toString().length < 2 ? '0' + i : i.toString()) } for (let j = 0; j < 24; j++) { hours.push(j.toString().length < 2 ? '0' + j : j.toString()) } dates = this.getDays(nowYear) this.setData({ hourArr: hours, minArr: mins, dateArr: dates }) }, getDays(year) { let pre_days = [] let now_days = [] let aft_days = [] if (this.data.month == 'undefined') { /** 按年處理 */ // 判斷型別 if (this.data.type == 'left') { for (let a = this.data.year; a >= 1; a--) { pre_days.push(...this.getDaysByYear(year - a, true)) } } else if (this.data.type == 'right') { for (let b = 1; b <= this.data.year; b++) { aft_days.push(...this.getDaysByYear(year + b, true)) } } else { for (let a = this.data.year; a >= 1; a--) { pre_days.push(...this.getDaysByYear(year - a, true)) } for (let b = 1; b <= this.data.year; b++) { aft_days.push(...this.getDaysByYear(year + b, true)) } } now_days = this.getDaysByYear(year) } else { /** 按月處理 */ now_days = this.getDaysByMonth(year, this.data.type) } return pre_days.concat(now_days.concat(aft_days)) }, getDaysByYear(year, isIncludeYear) { let days = [] for (let k = 1; k < 13; k++) { let each_days = new Date(year, k, 0).getDate() for (let _k = 1; _k <= each_days; _k++) { let time = +new Date(`${year}-${k}-${_k}`) if (isIncludeYear) { days.push({ name: utils.formatTime(time, '{y}年{m}月{d}日周{a}'), value: time }) } else { days.push({ name: utils.formatTime(time, '{m}月{d}日周{a}'), value: time }) } } } return days }, getDaysByMonth(year, type) { let days = [] let nowMonth = new Date().getMonth() + 1 // 當月份傳負的或0時當成本月 if (this.data.month > 0) { let months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] let pre_mons = [] let aft_mons = [] // 生成往前、往後的月份陣列 for (let k = 1; k <= this.data.month; k++) { let tmp_pre = months.indexOf(nowMonth) - k let tmp_aft = months.indexOf(nowMonth) + k pre_mons.unshift(months[tmp_pre < 0 ? 12 + tmp_pre : tmp_pre]) aft_mons.push(months[tmp_aft > 12 ? tmp_aft - 12 : tmp_aft]) } if (type != 'right') { // 往前的月份的日期 pre_mons.forEach(v => { // 跨年 let month_days = 0 if (v > nowMonth) { month_days = new Date(year - 1, v, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year - 1}-${v}-${k}`) days.push({ name: utils.formatTime(time, '{y}年{m}月{d}日周{a}'), value: time }) } } else { month_days = new Date(year, v, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year}-${v}-${k}`) days.push({ name: utils.formatTime(time, '{m}月{d}日周{a}'), value: time }) } } }) } // 本月的日期 let month_days = new Date(year, nowMonth, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year}-${nowMonth}-${k}`) days.push({ name: utils.formatTime(time, '{m}月{d}日周{a}'), value: time }) } if (type != 'left') { // 往後的月份的日期 aft_mons.forEach(_v => { // 跨年 let month_days = 0 if (_v < nowMonth) { month_days = new Date(year + 1, _v, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year + 1}-${_v}-${k}`) days.push({ name: utils.formatTime(time, '{y}年{m}月{d}日周{a}'), value: time }) } } else { month_days = new Date(year, _v, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year}-${_v}-${k}`) days.push({ name: utils.formatTime(time, '{m}月{d}日周{a}'), value: time }) } } }) } } else { let month_days = new Date(year, nowMonth, 0).getDate() for (let k = 1; k <= month_days; k++) { let time = +new Date(`${year}-${nowMonth}-${k}`) days.push({ name: utils.formatTime(time, '{m}月{d}日周{a}'), value: time }) } } return days }, dateChange(e) { const day = this.data.dateArr[e.detail.value[0]] let time = day.value + (Number(this.data.hourValue) * 3600 + Number(this.data.minValue) * 60) * 1000 this.setData({ dateIndex: e.detail.value[0], activeTime: time }) }, hourChange(e) { const hour = Number(this.data.hourArr[e.detail.value[0]]) let time = this.data.dateArr[this.data.dateIndex].value + (hour * 3600 + Number(this.data.minValue) * 60) * 1000 this.setData({ hourValue: this.data.hourArr[e.detail.value[0]], activeTime: time }) }, minChange(e) { const min = Number(this.data.minArr[e.detail.value[0]]) let time = this.data.dateArr[this.data.dateIndex].value + (Number(this.data.hourValue) * 3600 + min * 60) * 1000 this.setData({ minValue: this.data.minArr[e.detail.value[0]], activeTime: time }) }, bindclose() { this.setData({ show: false }) }, preventTouchMove() { // 阻止半屏狀態下 頁面滑動 } } })
wxss程式碼
.selector__picker { width: 100%; height: 80%; margin-top: 20px; font-size: 24px; }
上述程式碼中,js中參照的 utils 功能函數如下:
/** * 日期格式化 */ export function formatTime(time, cFormat) { if (arguments.length === 0) { return '' } const format = cFormat || '{y}-{m}-{d}' let date if (time === undefined || time === 0 || time === '') { return '' } else if (typeof time === 'object') { date = time } else { if (('' + time).length === 10) time = parseInt(time) * 1000 date = new Date(time) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay() } const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] // Note: getDay() returns 0 on Sunday if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } if (result.length > 0 && value < 10) { value = '0' + value } return value || 0 }) return time_str }
另外wxml中使用的一些wxss公共樣式就不提供了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援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