Files
2025-04-30 14:08:39 +08:00

270 lines
7.8 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="w-picker-view">
<picker-view class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">
<picker-view-column>
<view class="w-picker-item" v-for="(item, index) in range.dates" :key="index">{{ item.label }}</view>
</picker-view-column>
<picker-view-column>
<view class="w-picker-item" v-for="(item, index) in range.hours" :key="index">{{ item.label }}时</view>
</picker-view-column>
<picker-view-column>
<view class="w-picker-item" v-for="(item, index) in range.minutes" :key="index">{{ item.label }}</view>
</picker-view-column>
</picker-view>
</view>
</template>
<script>
export default {
data() {
return {
pickVal: [],
range: {},
checkObj: {},
}
},
props: {
itemHeight: {
type: String,
default: '44px',
},
value: {
type: [String, Array, Number],
default: '',
},
current: {
//是否默认选中当前日期
type: Boolean,
default: false,
},
expand: {
type: [Number, String],
default: 30,
},
},
watch: {
value(val) {
this.initData()
},
},
created() {
this.initData()
},
methods: {
formatNum(n) {
return Number(n) < 10 ? '0' + Number(n) : Number(n) + ''
},
checkValue(value) {
let strReg = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}(:\d{2})?$/,
example = '2019-12-12 18:05:00或者2019-12-12 18:05'
if (!strReg.test(value)) {
console.log(new Error('请传入与mode、fields匹配的value值例value=' + example + ''))
}
return strReg.test(value)
},
resetData(year, month, day) {
let curDate = this.getCurrenDate()
let curFlag = this.current
let curYear = curDate.curYear
let curMonth = curDate.curMonth
let curDay = curDate.curDay
let curHour = curDate.curHour
let months = [],
days = [],
sections = []
let disabledAfter = this.disabledAfter
let monthsLen = disabledAfter ? (year * 1 < curYear ? 12 : curMonth) : 12
let totalDays = new Date(year, month, 0).getDate() //计算当月有几天;
for (let month = 1; month <= monthsLen; month++) {
months.push(this.formatNum(month))
}
for (let day = 1; day <= daysLen; day++) {
days.push(this.formatNum(day))
}
return {
months,
days,
sections,
}
},
getData(dVal) {
//用来处理初始化数据
let curFlag = this.current
let disabledAfter = this.disabledAfter
let dates = [],
hours = [],
minutes = []
let curDate = new Date()
let curYear = curDate.getFullYear()
let curMonth = curDate.getMonth()
let curDay = curDate.getDate()
let aDate = new Date(curYear, curMonth, curDay)
for (let i = 0; i < this.expand * 1; i++) {
aDate = new Date(curYear, curMonth, curDay + i)
let year = aDate.getFullYear()
let month = aDate.getMonth() + 1
let day = aDate.getDate()
let label = year + '-' + this.formatNum(month) + '-' + this.formatNum(day)
switch (i) {
case 0:
label = '今天'
break
case 1:
label = '明天'
break
case 2:
label = '后天'
break
}
dates.push({
label: label,
value: year + '-' + this.formatNum(month) + '-' + this.formatNum(day),
})
}
for (let i = 0; i < 24; i++) {
hours.push({
label: this.formatNum(i),
value: this.formatNum(i),
})
}
for (let i = 0; i < 60; i++) {
minutes.push({
label: this.formatNum(i),
value: this.formatNum(i),
})
}
return {
dates,
hours,
minutes,
}
},
getDefaultDate() {
let value = this.value
let reg = /-/g
let defaultDate = value ? new Date(value.replace(reg, '/')) : new Date()
let defaultYear = defaultDate.getFullYear()
let defaultMonth = defaultDate.getMonth() + 1
let defaultDay = defaultDate.getDate()
let defaultDays = new Date(defaultYear, defaultMonth, 0).getDate() * 1
return {
defaultDate,
defaultYear,
defaultMonth,
defaultDay,
defaultDays,
}
},
getDval() {
let value = this.value
let dVal = null
let aDate = new Date()
let year = this.formatNum(aDate.getFullYear())
let month = this.formatNum(aDate.getMonth() + 1)
let day = this.formatNum(aDate.getDate())
let date = this.formatNum(year) + '-' + this.formatNum(month) + '-' + this.formatNum(day)
let hour = aDate.getHours()
let minute = aDate.getMinutes()
if (value) {
let flag = this.checkValue(value)
if (!flag) {
dVal = [date, hour, minute]
} else {
let v = value.split(' ')
dVal = [v[0], ...v[1].split(':')]
}
} else {
dVal = [date, hour, minute]
}
return dVal
},
initData() {
let startDate, endDate, startYear, endYear, startMonth, endMonth, startDay, endDay
let dates = [],
hours = [],
minutes = []
let dVal = [],
pickVal = []
let value = this.value
let reg = /-/g
let range = {}
let result = '',
full = '',
date,
hour,
minute,
obj = {}
let defaultDate = this.getDefaultDate()
let defaultYear = defaultDate.defaultYear
let defaultMonth = defaultDate.defaultMonth
let defaultDay = defaultDate.defaultDay
let defaultDays = defaultDate.defaultDays
let curFlag = this.current
let disabledAfter = this.disabledAfter
let dateData = []
dVal = this.getDval()
dateData = this.getData(dVal)
dates = dateData.dates
hours = dateData.hours
minutes = dateData.minutes
pickVal = [
dates.findIndex((n) => n.value == dVal[0]) != -1 ? dates.findIndex((n) => n.value == dVal[0]) : 0,
hours.findIndex((n) => n.value == dVal[1]) != -1 ? hours.findIndex((n) => n.value == dVal[1]) : 0,
minutes.findIndex((n) => n.value == dVal[2]) != -1 ? minutes.findIndex((n) => n.value == dVal[2]) : 0,
]
range = { dates, hours, minutes }
date = dVal[0] ? dVal[0] : dates[0].label
hour = dVal[1] ? dVal[1] : hours[0].label
minute = dVal[2] ? dVal[2] : minutes[0].label
result = full = `${date + ' ' + hour + ':' + minute}`
obj = {
date,
hour,
minute,
}
this.range = range
this.checkObj = obj
this.$nextTick(() => {
this.pickVal = pickVal
})
this.$emit('change', {
result: result,
value: full,
obj: obj,
})
},
handlerChange(e) {
let arr = [...e.detail.value]
let data = this.range
let date = '',
hour = '',
minute = ''
let result = '',
full = '',
obj = {}
let disabledAfter = this.disabledAfter
date = arr[0] || arr[0] == 0 ? data.dates[arr[0]] || data.dates[data.dates.length - 1] : ''
hour = arr[1] || arr[1] == 0 ? data.hours[arr[1]] || data.hours[data.hours.length - 1] : ''
minute = arr[2] || arr[2] == 0 ? data.minutes[arr[2]] || data.minutes[data.minutes.length - 1] : ''
result = `${date.label + ' ' + hour.label + ':' + minute.label + ':00'}`
full = `${date.value + ' ' + hour.label + ':' + minute.label + ':00'}`
obj = {
date,
hour,
minute,
}
this.checkObj = obj
this.$emit('change', {
result: result,
value: full,
obj: obj,
})
},
},
}
</script>
<style lang="scss">
@import './w-picker.css';
</style>