From a38f54f02b48cf8ef2c9ed6febed560b4f38d534 Mon Sep 17 00:00:00 2001 From: wjt <1797368093@qq.com> Date: 星期五, 21 六月 2024 15:26:42 +0800 Subject: [PATCH] Merge branch 'master' of http://218.28.192.34:9999/r/sqys/sqys_xcx --- uni_modules/yt-dateTimePicker/components/yt-dateTimePicker/yt-dateTimePicker.vue | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 339 insertions(+), 0 deletions(-) diff --git a/uni_modules/yt-dateTimePicker/components/yt-dateTimePicker/yt-dateTimePicker.vue b/uni_modules/yt-dateTimePicker/components/yt-dateTimePicker/yt-dateTimePicker.vue new file mode 100644 index 0000000..4e32bc2 --- /dev/null +++ b/uni_modules/yt-dateTimePicker/components/yt-dateTimePicker/yt-dateTimePicker.vue @@ -0,0 +1,339 @@ +<template> + <view class="yt-dateTimePicker" v-if="done"> + <view class="mask" :class="{ show: open }" @touchmove.stop.prevent catchtouchmove="true"> + </view> + <view class="wrap" :class="{ show: open }"> + <view class="picker-header" @touchmove.stop.prevent catchtouchmove="true"> + <view class="btn-picker cancel" @click="open = false">鍙栨秷</view> + <view class="btn-picker submit" @click="_onSubmit">纭畾</view> + </view> + <view class="picker-body"> + <picker-view :value="value" @change="_onChange"> + <picker-view-column :disable-flicking="true" v-if="timeHide[0]"> + <view class="column-item" v-for="item in years" :key="item"> + {{ item + timeLabel[0] }} + </view> + </picker-view-column> + <picker-view-column :disable-flicking="true" v-if="timeHide[1]"> + <view class="column-item" v-for="item in months" :key="item"> + {{ formatNum(item) + timeLabel[1] }} + </view> + </picker-view-column> + <picker-view-column :disable-flicking="true" v-if="timeHide[2]"> + <view class="column-item" v-for="item in days" :key="item"> + {{ formatNum(item) + timeLabel[2] }} + </view> + </picker-view-column> + <picker-view-column :disable-flicking="true" v-if="timeHide[3]"> + <view class="column-item" v-for="item in hours" :key="item"> + {{ formatNum(item) + timeLabel[3] }} + </view> + </picker-view-column> + <picker-view-column :disable-flicking="true" v-if="timeHide[4]"> + <view class="column-item" v-for="item in minutes" :key="item"> + {{ formatNum(item) + timeLabel[4] }} + </view> + </picker-view-column> + <picker-view-column :disable-flicking="true" v-if="timeHide[5]"> + <view class="column-item" v-for="item in seconds" :key="item"> + {{ formatNum(item) + timeLabel[5] }} + </view> + </picker-view-column> + </picker-view> + </view> + </view> + </view> +</template> + +<script> + export default { + name: "yt-dateTimePicker", + props: { + startYear: { + type: Number, + default: 2000, + }, + endYear: { + type: Number, + default: 2099, + }, + timeLabel: { + type: Array, + default: () => ["骞�", "鏈�", "鏃�", "鏃�", "鍒�", "绉�"], + }, + timeHide: { + type: Array, + default: () => [true, true, true, true, true, true], + }, + timeInit: { + type: String, + default: '', //new Date('2023-5-20').valueOf() + }, + }, + + data() { + return { + open: false, + years: [], + months: [], + days: [], + hours: [], + minutes: [], + seconds: [], + year: "", + month: "", + day: "", + hour: "", + minute: "", + second: "", + value: [0, 0, 0, 0, 0, 0], + done: false, + }; + }, + + computed: { + currentDatetime() { + return this.timeInit ? new Date(new Date(`${this.timeInit}`).valueOf()) : new Date(new Date().valueOf()); + }, + }, + + mounted() { + this.init(); + }, + + watch: { + month() { + this.initDays(); + }, + }, + + methods: { + init() { + this.initYears(); + this.initMonths(); + this.initDays(); + this.initHours(); + this.initMinutes(); + this.initSeconds(); + this.setSelectValue(); + this.done = true; + }, + + initYears() { + const years = []; + for (let year = this.startYear; year <= this.endYear; year++) { + years.push(year); + if (this.currentDatetime.getFullYear() === year) { + this.$set(this.value, 0, year - this.startYear); + } + } + this.years = years; + }, + + initMonths() { + const months = []; + for (let month = 1; month <= 12; month++) { + months.push(month); + if (this.currentDatetime.getMonth() + 1 === month) { + this.$set(this.value, 1, month - 1); + } + } + this.months = months; + }, + + initDays() { + const value = this.value; + const selectedYear = this.years[value[0]]; + const selectedMonth = this.months[value[1]]; + const days = []; + const totalDays = new Date(selectedYear, selectedMonth, 0).getDate(); + for (let day = 1; day <= totalDays; day++) { + days.push(day); + if (this.currentDatetime.getDate() === day) { + this.$set(value, 2, day - 1); + } + } + this.days = days; + }, + + initHours() { + const hours = []; + for (let hour = 0; hour <= 23; hour++) { + hours.push(hour); + if (this.currentDatetime.getHours() === hour) { + this.$set(this.value, 3, hour); + } + } + this.hours = hours; + }, + + initMinutes() { + const minutes = []; + for (let minute = 0; minute < 60; minute++) { + minutes.push(minute); + if (this.currentDatetime.getMinutes() === minute) { + this.$set(this.value, 4, minute); + } + } + this.minutes = minutes; + }, + + initSeconds() { + const seconds = []; + for (let second = 0; second < 60; second++) { + seconds.push(second); + if (this.currentDatetime.getSeconds() === second) { + this.$set(this.value, 5, second); + } + } + this.seconds = seconds; + }, + + show() { + this.init(); + this.open = true; + }, + + hide() { + this.open = false; + }, + + _onChange(e) { + this.value = e.detail.value; + this.setSelectValue(); + }, + + setSelectValue() { + const v = this.value; + this.year = this.years[v[0]]; + this.month = this.months[v[1]]; + this.day = this.days[v[2]]; + this.hour = this.hours[v[3]]; + this.minute = this.minutes[v[4]]; + this.second = this.seconds[v[5]]; + }, + + _onSubmit() { + const { + year, + month, + day, + hour, + minute, + second, + formatNum, + timeHide, + timeLabel, + } = this; + const result = { + year: timeHide[0] ? formatNum(year) : "", + month: timeHide[1] ? formatNum(month) : "", + day: timeHide[2] ? formatNum(day) : "", + hour: timeHide[3] ? formatNum(hour) : "", + minute: timeHide[4] ? formatNum(minute) : "", + second: timeHide[5] ? formatNum(second) : "", + }; + this.$emit("submit", result); + this.hide(); + }, + + formatNum(num) { + return num < 10 ? "0" + num : num + ""; + }, + }, + }; +</script> + +<style lang="scss"> + $transition: all 0.3s ease; + $primary: #1171E0; + + .yt-dateTimePicker { + position: relative; + z-index: 999; + + picker-view { + height: 100%; + } + + .mask { + position: fixed; + z-index: 1000; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.4); + visibility: hidden; + opacity: 0; + transition: $transition; + + &.show { + visibility: visible; + opacity: 1; + } + } + + .wrap { + z-index: 1001; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + transition: $transition; + transform: translateY(100%); + + &.show { + transform: translateY(0); + } + } + + .picker-header { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 8px 8px; + background-color: darken(#fff, 2%); + background-color: #fff; + } + + .picker-body { + width: 100%; + height: 420rpx; + overflow: hidden; + background-color: #fff; + } + + .column-item { + text-overflow: ellipsis; + white-space: nowrap; + display: flex; + justify-content: center; + align-items: center; + } + + .btn-picker { + position: relative; + display: inline-block; + padding-left: 10px; + padding-right: 10px; + box-sizing: border-box; + text-align: center; + text-decoration: none; + line-height: 2; + -webkit-tap-highlight-color: transparent; + overflow: hidden; + background-color: #eee; + font-size: 14px; + border-radius: 3px; + color: #000; + cursor: pointer; + } + + .btn-picker.submit { + background-color: $primary; + color: #fff; + } + } +</style> \ No newline at end of file -- Gitblit v1.9.1