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

<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>