<!-- 日期组件 --> <template> <view class="tm-pickersDateView flex-start px-24" :class="[black_tmeme ? 'grey-darken-5' : bgColor]"> <!-- :value="value_default" @change="change" --> <picker-view @pickstart="$emit('aniStart')" @pickend="$emit('aniEnd')" @change="change" v-if="list_cD != null" :value="value_default" :mask-style="black_tmeme ? 'opacity:0;' : ''" indicator-style="height:50px;" indicator-class="tm-pickersCView-item-h" class="tm-pickersCView-wk" > <picker-view-column v-for="(item, key) in list_cD" :key="key"> <view class="tm-pickersCView-item fulled-height flex-center " style="margin: 0 5px;" :class="[value_default[reIndex(key)] == index_pub ? ' text-weight-b active' : '', black_tmeme ? 'bk' : '', 'text-size-n']" v-for="(item_data, index_pub) in item" :key="index_pub" > <text>{{ buqi(item_data) }}</text> <text v-if="mode">{{ modhz[key] }}</text> </view> </picker-view-column> </picker-view> </view> </template> <script> /** * 日期下拉选择器(嵌入式) * @description 多级关联,单级关联选择 * @property {Array} default-value = [] 默认:当前的时间,初始显示的时间 * @property {String|Number} item-height = [34|42|50|58|62] 项目的高度单位px * @property {String|Boolean} black = [true|false] 是否开启暗黑模式。 * @property {String|Boolean} disabled = [true|false] 是否禁用 * @property {String} bg-color = [white|blue] 默认:white,白色背景;请填写背景的主题色名称。 * @property {Object} show-detail = [{year:true,month:true,day:true,hour:false,min:false,sec:false}] 默认:{year:true,month:true,day:true,hour:false,min:false,sec:false} * @property {String} start = [1900-1-1 00:00:00] 默认:1900-1-1 00:00:00,开始的时间 * @property {String} end = [] 默认:当前,结束的时间 * @property {String|Boolean} mode = [true|false] 默认:true,是否显示中文年,月后缀 * @property {String|Boolean} full-number = [true|false] 默认:true,是否把个位数补齐双位数 */ export default { name: 'tm-pickersDateView', props: { // 行高。 itemHeight: { type: String | Number, default: 40 }, black: { type: String | Boolean, default: null }, // 是否禁用 disabled: { type: String | Boolean, default: false }, // 背景颜色,主题色名称。 bgColor: { type: String, default: 'white' }, //要展示的时间。 showDetail: { type: Object, default: () => { return { year: true, //年 month: true, //月 day: true, //天 hour: false, //小时 min: false, //分 sec: false //秒 }; } }, start: { type: String, default: '1949-1-1 00:00:00' }, end: { type: String, default: '' }, defaultValue: '', // 是否显示中文年,月后缀 mode: { type: String | Boolean, default: true }, //要展示的时间。 modeValue: { type: Object, default: () => { return { year: '年', //年 month: '月', //月 day: '日', //天 hour: '时', //小时 min: '分', //分 sec: '秒' //秒 }; } }, // 是否把个位数补齐双位数 fullNumber: { type: String | Boolean, default: true } }, data() { return { scrollEvent: 0, childrenIndex: 0, scrollChildrenIndex: 0, listIndex: [], listData: [[], [], [], [], [], []], dataCauser: { year: false, //年 month: false, //月 day: false, //天 hour: false, //小时 min: false, //分 sec: false //秒 }, hoz: { year: '年', //年 month: '月', //月 day: '日', //天 hour: '时', //小时 min: '分', //分 sec: '秒' //秒 }, startTime: null, endTime: null, value_default: [], pre_value: [], syheng_key: [], list_cD: null }; }, created() { this.dataCauser = { ...this.dataCauser, ...this.showDetail }; let ls = Object.keys(this.dataCauser); for (let i = 0; i < this.listData.length; i++) { let p = { itemIndex: 0, childrenIndex: 0, wz: 0 }; p[ls[i]] = this.dataCauser[ls[i]]; this.listIndex.push(p); } }, async mounted() { this.chulisdata(); await uni.$tm.sleep(60); this.chulishijian(); this.setDefaultValue(); }, watch: { defaultValue: async function() { if (this.list_cD == null) return; await this.setDefaultValue(); }, start: async function() { if (this.list_cD == null) return; this.chulisdata(); this.chulishijian(); await this.setDefaultValue(); }, end: async function() { if (this.list_cD == null) return; await this.setDefaultValue(); } }, computed: { black_tmeme: function() { if (this.black !== null) return this.black; return this.$tm.vx.state().tmVuetify.black; }, modhz: function() { return { ...this.hoz, ...this.modeValue }; } }, methods: { reIndex(key) { let id = 0; for (let i = 0; i < this.syheng_key.length; i++) { if (this.syheng_key[i] == key) { id = i; break; } } return id; }, chulishijian() { let kl = Object.keys(this.dataCauser); let d = {}; let pk = []; for (let i = 0; i < kl.length; i++) { if (this.dataCauser[kl[i]] == true) { let sj = null; let key = ''; if (kl[i] == 'year') { sj = this.listData[0]; key = 'year'; } else if (kl[i] == 'month') { sj = this.listData[1]; key = 'month'; } else if (kl[i] == 'day') { sj = this.listData[2]; key = 'day'; } else if (kl[i] == 'hour') { sj = this.listData[3]; key = 'hour'; } else if (kl[i] == 'min') { sj = this.listData[4]; key = 'min'; } else if (kl[i] == 'sec') { sj = this.listData[5]; key = 'sec'; } d[kl[i]] = {...sj}; pk.push(key); } } this.list_cD = {...d}; this.syheng_key = [...pk]; }, buqi(val) { return val > 9 ? '' + val : '0' + val; }, SeletecdeIndexdefault() { let kl = Object.keys(this.dataCauser); let d = []; for (let i = 0; i < this.listIndex.length; i++) { if (this.listIndex[i][kl[i]] == true) { d.push(this.listIndex[i].itemIndex); } } this.value_default = d; }, // 获取当前选中的数据。 getSelectedValue() { let t = this; let ap = []; this.listIndex.forEach((item, index) => { ap.push(t.listData[index][item.itemIndex]); }); let jg = { year: ap[0], //年 month: ap[1], //月 day: ap[2], //天 hour: ap[3], //小时 min: ap[4], //分 sec: ap[5] //秒 }; let ar = Object.keys(this.dataCauser); ar.forEach(item => { if (t.dataCauser[item] === false) { delete jg[item]; } }); return jg; }, chulisdata() { if (typeof this.showDetail === 'object') { this.dataCauser = { ...this.dataCauser, ...this.showDetail }; } this.startTime = new Date(this.start.replace(/-/g, '/')); if (isNaN(this.startTime.getFullYear())) { this.startTime = new Date('1949/1/1 00:00:00'); } this.endTime = new Date(this.end.replace(/-/g, '/')); if (isNaN(this.endTime.getFullYear())) { this.endTime = new Date(); } let s_y = this.startTime.getFullYear(); let s_m = this.startTime.getMonth() + 1; let s_d = this.startTime.getDate(); let s_h = this.startTime.getHours(); let s_mm = this.startTime.getMinutes(); let s_s = this.startTime.getSeconds(); let e_y = this.endTime.getFullYear(); let e_m = this.endTime.getMonth() + 1; let e_d = this.endTime.getDate(); let e_h = this.endTime.getHours(); let e_mm = this.endTime.getMinutes(); let e_s = this.endTime.getSeconds(); let n_y = this.listData[0][this.listIndex[0].itemIndex]; n_y = n_y == undefined ? 1949 : n_y; let n_m = this.listData[1][this.listIndex[1].itemIndex]; n_m = n_m == undefined ? 1 : n_m; let n_d = this.listData[2][this.listIndex[2].itemIndex]; n_d = n_d == undefined ? 1 : n_d; let n_h = this.listData[3][this.listIndex[3].itemIndex]; n_h = n_h == undefined ? 0 : n_h; let n_mm = this.listData[4][this.listIndex[4].itemIndex]; n_mm = n_mm == undefined ? 0 : n_mm; let n_s = this.listData[5][this.listIndex[5].itemIndex]; n_s = n_s == undefined ? 0 : n_s; let nowDate = new Date(n_y + '/' + n_m + '/' + n_d + ' ' + n_h + ':' + n_mm + ':' + n_s); function monthDay(year, month) { let date = new Date(year, month, 1, 0, 0, 0); let yesterDay = new Date(date - 1000); return yesterDay.getDate(); } //年,开始,结束。 let tsb = [[s_y, e_y]]; for (let i = 1; i < 6; i++) { let st = 0; let et = 0; if (i == 1) { st = 1; et = 12; if (n_y === s_y) { st = s_m; et = 12; } if (n_y === e_y) { st = 1; et = e_m; } if(s_y===e_y&&n_y===s_y){ st = s_m; et = e_m; } } if (i == 2) { let months = [31, monthDay(n_y, 2), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; st = 1; et = months[n_m - 1]; if (n_y === s_y && n_m === s_m) { st = s_d; } if (n_y === e_y && n_m === e_m) { et = e_d; } } if (i == 3) { st = 0; et = 23; if (n_y === s_y && n_m === s_m && n_d === s_d) { st = s_h; } if (n_y === e_y && n_m === e_m && n_d === e_d) { et = e_h; } } if (i == 4) { st = 0; et = 59; if (n_y === s_y && n_m === s_m && n_d === s_d && n_h === s_h) { st = s_mm; } if (n_y === e_y && n_m === e_m && n_d === e_d && n_h === e_h) { et = e_mm; } } if (i == 5) { st = 0; et = 59; if (n_y === s_y && n_m === s_m && n_d === s_d && n_h === s_h && n_mm === s_mm) { st = s_s; } if (n_y === e_y && n_m === e_m && n_d === e_d && n_h === e_h && n_mm === e_mm) { et = e_s; } } tsb.push([st, et]); } for (let ik = 0; ik < tsb.length; ik++) { let idate = tsb[ik]; let py_data = []; for (let i = idate[0]; i <= idate[1]; i++) { py_data.push(i); } this.listData.splice(ik, 1, py_data); } return this.listData; }, setDefaultValue(date) { this.chulisdata(); this.chulishijian(); uni.$tm.sleep(50) .then(()=>this.inits(date)) .then(()=>{ this.chulisdata(); this.chulishijian(); return uni.$tm.sleep(50); }).then(()=>{ this.SeletecdeIndexdefault(); this.chulisdata(); }) }, async inits(date) { let t = this; let mobj; if (date) { mobj = new Date(date.replace(/-/g, '/')); } else { try { mobj = new Date(this.defaultValue.replace(/-/g, '/')); } catch (e) { mobj = new Date(); } if (!this.defaultValue || isNaN(mobj.getFullYear())) { mobj = new Date(); } } let s_y = this.startTime.getFullYear(); let s_m = this.startTime.getMonth() + 1; let s_d = this.startTime.getDate(); let s_h = this.startTime.getHours(); let s_mm = this.startTime.getMinutes(); let s_s = this.startTime.getSeconds(); let e_y = this.endTime.getFullYear(); let e_m = this.endTime.getMonth() + 1; let e_d = this.endTime.getDate(); let e_h = this.endTime.getHours(); let e_mm = this.endTime.getMinutes(); let e_s = this.endTime.getSeconds(); let n_y = mobj.getFullYear(); let n_m = mobj.getMonth() + 1; let n_d = mobj.getDate(); let n_h = mobj.getHours(); let n_mm = mobj.getMinutes(); let n_s = mobj.getSeconds(); if (mobj.getTime() >= this.endTime.getTime()) { n_y = e_y; n_m = e_m; n_d = e_d; n_h = e_h; n_mm = e_mm; n_s = e_s; } if (mobj.getTime() <= this.startTime.getTime()) { n_y = s_y; n_m = s_m; n_d = s_d; n_h = s_h; n_mm = s_mm; n_s = s_s; } let tsb = [n_y, n_m, n_d, n_h, n_mm, n_s]; for (let ik = 0; ik < tsb.length; ik++) { let itemIndex_y = this.listData[ik].findIndex(item => item == tsb[ik]); if (itemIndex_y > -1) { this.$set(this.listIndex[ik], 'itemIndex', itemIndex_y); } else { this.$set(this.listIndex[ik], 'itemIndex', 0); } } }, change(e, index) { console.log(this.list_cD); let pl = e.detail.value; this.pre_value = [...this.value_default]; if (this.disabled) { this.value_default = this.pre_value; return; } for (let i = 0; i < this.syheng_key.length; i++) { for (let j = 0; j < this.listIndex.length; j++) { if (this.listIndex[j][this.syheng_key[i]] == true) { this.$set(this.listIndex[j], 'itemIndex', pl[i]); } } } this.chulisdata(); this.chulishijian(); this.value_default = pl; }, jswid() { let wd = this.gridNum - 1 - 2; if (wd <= 0) wd = 1; return 100 / wd; }, scrllEnd(e) { function monthDay(year, month) { var date = new Date(year, month, 1, 0, 0, 0); var yesterDay = new Date(date - 1000); return yesterDay.getDate(); } if (!this.scrollEvent) return; let dNum = this.gridNum; let d; let t = this; let idb = 88; let idc = 884; let srcllTop = this.scrollEvent.detail.scrollTop; if (srcllTop <= 0) { srcllTop = 0; } else if (srcllTop >= this.scrollEvent.detail.srcollHeigh) { srcllTop = this.scrollEvent.detail.srcollHeigh; } d = Math.ceil((srcllTop - this.itemHeight / 2) / this.itemHeight); if (d >= t.listData[t.childrenIndex].length - 1) { d = t.listData[t.childrenIndex].length - 1; } t.$set(t.listIndex[t.childrenIndex], 'wz', srcllTop); let old_index = this.listIndex[this.childrenIndex].itemIndex || 0; if (t.disabled) { clearTimeout(idb); idb = setTimeout(function() { t.$nextTick(function() { t.$set(t.listIndex[t.childrenIndex], 'wz', old_index * t.itemHeight); }); }, 5); return; } this.$set(this.listIndex[t.childrenIndex], 'itemIndex', d); t.chulisdata(); clearTimeout(idb); idb = setTimeout(function() { t.$nextTick(function() { t.$set(t.listIndex[t.childrenIndex], 'wz', d * t.itemHeight); for (let lsindex = t.childrenIndex + 1; lsindex < 6; lsindex++) { if (t.listData[lsindex][t.listIndex[lsindex].itemIndex] == undefined) { let pda = t.listData[lsindex].length - 1; if (d >= pda) { this.$set(this.listIndex[lsindex], 'itemIndex', pda); t.$set(t.listIndex[lsindex], 'wz', pda * t.itemHeight); } else { this.$set(this.listIndex[lsindex], 'itemIndex', 0); t.$set(t.listIndex[lsindex], 'wz', 0); } } else { let srcllTop_s = t.listIndex[lsindex].wz; const tsdd = t.listIndex[lsindex].itemIndex; t.$set(t.listIndex[lsindex], 'wz', tsdd * t.itemHeight - 1); this.$nextTick(function() { t.$set(t.listIndex[lsindex], 'wz', tsdd * t.itemHeight); }); } } }); }, 10); } } }; </script> <style> .tm-pickersDateView .tm-pickersCView-item-h { height: 50px; background-color: rgba(0, 0, 0, 0.03); width: calc(100% - 10px); margin-left: 5px; border-radius: 20rpx; border: none; } .tm-pickersDateView .tm-pickersCView-item-h::after, .tm-pickersDateView .tm-pickersCView-item-h::before { border: none; } .tm-pickersDateView .tm-pickersCView-wk { position: relative; width: 750rpx; height: 500rpx; } .tm-pickersDateView .tm-pickersCView-wk .tm-pickersCView-item.bk { opacity: 0.4; } .tm-pickersDateView .tm-pickersCView-wk .tm-pickersCView-item.active { opacity: 1; border-radius: 20rpx; border: none; background-color: rgba(0, 0, 0, 0.06); } .tm-pickersDateView .tm-pickersCView-wk .tm-pickersCView-item.active.bk { background-color: rgba(255, 255, 255, 0.06); } </style>