You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
222 lines
5.7 KiB
222 lines
5.7 KiB
<template>
|
|
<view class="day component">
|
|
<picker-view :value="active" :style="[{height:height}]" :indicator-style="`height: ${lineHeight};`"
|
|
@change="bindChange" class="picker-view">
|
|
<!-- 使用v-show会有问题 -->
|
|
<picker-view-column v-if="typeList.includes('year')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in yearList" :key="index">
|
|
{{item}}年
|
|
</view>
|
|
</picker-view-column>
|
|
<picker-view-column v-if="typeList.includes('month')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in monthList" :key="index">
|
|
{{item}}月
|
|
</view>
|
|
</picker-view-column>
|
|
<picker-view-column v-if="typeList.includes('day')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in dayList" :key="index">
|
|
{{item}}日
|
|
</view>
|
|
</picker-view-column>
|
|
<picker-view-column v-if="typeList.includes('hour')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in hourList" :key="index">
|
|
{{item}}时
|
|
</view>
|
|
</picker-view-column>
|
|
<picker-view-column v-if="typeList.includes('minute')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in minuteList" :key="index">
|
|
{{item}}分
|
|
</view>
|
|
</picker-view-column>
|
|
<picker-view-column v-if="typeList.includes('second')">
|
|
<view class="item" :style="[{height:lineHeight}]" v-for="(item,index) in secondList" :key="index">
|
|
{{item}}秒
|
|
</view>
|
|
</picker-view-column>
|
|
</picker-view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
buildYearData,
|
|
buildMonthData,
|
|
buildDayData,
|
|
buildHourData,
|
|
buildMinuteData,
|
|
buildSecondData,
|
|
bigerZero
|
|
} from "./util.js"
|
|
export default {
|
|
props: {
|
|
type: {
|
|
type: String,
|
|
default: "year,month,day,hour,minute,second"
|
|
},
|
|
filter: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
value: {
|
|
type: Date,
|
|
default: () => new Date()
|
|
},
|
|
height: {
|
|
type: String,
|
|
default: "600rpx"
|
|
},
|
|
lineHeight: {
|
|
type: String,
|
|
default: "60rpx"
|
|
},
|
|
year1: {
|
|
type: Number | Array,
|
|
default: new Date().getFullYear()
|
|
},
|
|
interval: {
|
|
type: Array,
|
|
default: () => [-3, 1]
|
|
},
|
|
current: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
rightnow: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
time: null,
|
|
active: [0, 0, 0, 0, 0, 0],
|
|
yearList: [],
|
|
monthList: [],
|
|
dayList: [],
|
|
hourList: [],
|
|
minuteList: [],
|
|
secondList: [],
|
|
}
|
|
},
|
|
created() {
|
|
|
|
},
|
|
watch: {
|
|
value: {
|
|
handler(val, oldVal) {
|
|
this.setDefault(val)
|
|
},
|
|
deep: true,
|
|
immediate: false,
|
|
},
|
|
typeList: {
|
|
handler(val, oldVal) {
|
|
this.$nextTick(() => {
|
|
this.emitChange()
|
|
})
|
|
},
|
|
deep: true,
|
|
immediate: false,
|
|
}
|
|
},
|
|
computed: {
|
|
typeList() {
|
|
return this.type.split(",")
|
|
}
|
|
},
|
|
mounted() {
|
|
this.setDefault(this.value)
|
|
if (this.rightnow) {
|
|
this.emitChange()
|
|
}
|
|
},
|
|
methods: {
|
|
setTime(time) {
|
|
this.setDefault(time)
|
|
this.$nextTick(() => {
|
|
this.emitChange()
|
|
})
|
|
},
|
|
setDefault(time) {
|
|
this.time = time;
|
|
if (typeof this.year1 == "number") {
|
|
this.buildInternalYearData()
|
|
} else if (Array.isArray(this.year1)) {
|
|
this.yearList = this.year1
|
|
}
|
|
let array = this.buildActiveItem()
|
|
this.buildInternalData(array)
|
|
this.$nextTick(() => {
|
|
this.active = array
|
|
})
|
|
},
|
|
buildActiveItem() {
|
|
let array = [0, 0, 0, 0, 0, 0];
|
|
let curTime = this.time;
|
|
array[0] = bigerZero(curTime.getFullYear() - this.yearList[0])
|
|
array[1] = bigerZero(curTime.getMonth())
|
|
array[2] = bigerZero(curTime.getDate() - 1)
|
|
array[3] = bigerZero(curTime.getHours())
|
|
array[4] = bigerZero(curTime.getMinutes())
|
|
array[5] = bigerZero(curTime.getSeconds())
|
|
return array
|
|
},
|
|
buildInternalYearData() {
|
|
if (typeof this.year1 == "number") {
|
|
this.yearList = buildYearData(this.year1, this.interval);
|
|
} else if (Array.isArray(this.year1)) {
|
|
this.yearList = this.year1
|
|
}
|
|
},
|
|
buildInternalData(active) {
|
|
this.monthList = buildMonthData(this.yearList[active[0]])
|
|
this.dayList = buildDayData(this.yearList[active[0]], this.monthList[active[1]])
|
|
this.hourList = buildHourData()
|
|
this.minuteList = buildMinuteData()
|
|
this.secondList = buildSecondData()
|
|
},
|
|
bindChange: function(e) {
|
|
const val = e.detail.value
|
|
this.active = val;
|
|
this.buildInternalYearData()
|
|
this.buildInternalData(this.active)
|
|
this.emitChange()
|
|
},
|
|
emitChange() {
|
|
let result = []
|
|
let year = this.yearList[this.active[0] >= this.yearList.length ? this.yearList.length - 1 : this.active[
|
|
0]]
|
|
let month = this.monthList[this.active[1] >= this.monthList.length ? this.monthList.length - 1 : this
|
|
.active[1]]
|
|
let day = this.dayList[this.active[2] >= this.dayList.length ? this.dayList.length - 1 : this.active[2]]
|
|
let hour = this.hourList[this.active[3] >= this.hourList.length ? this.hourList.length - 1 : this.active[
|
|
3]]
|
|
let minute = this.minuteList[this.active[4] >= this.minuteList.length ? this.minuteList.length - 1 : this
|
|
.active[4]]
|
|
let second = this.secondList[this.active[5] >= this.secondList.length ? this.secondList.length - 1 : this
|
|
.active[5]]
|
|
result = [year, month, day, hour, minute, second]
|
|
let timeStr = result[0] + "/" + result[1] + "/" + result[2] + " " + result[3] + ":" + result[4] + ":" +
|
|
result[5]
|
|
let time = new Date(timeStr)
|
|
this.$emit("change", time)
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.day.component {
|
|
.picker-view {
|
|
background: #f5f5f5;
|
|
}
|
|
|
|
.item {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
text-align: center;
|
|
|
|
}
|
|
}
|
|
</style>
|
|
|