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

395 lines
12 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 class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.fyears" :key="index">{{item}}年</view>
</picker-view-column>
<picker-view-column class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.fmonths" :key="index">{{item}}月</view>
</picker-view-column>
<picker-view-column class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.fdays" :key="index">{{item}}日</view>
</picker-view-column>
<picker-view-column class="w-picker-flex1">
<view class="w-picker-item">-</view>
</picker-view-column>
<picker-view-column class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.tyears" :key="index">{{item}}年</view>
</picker-view-column>
<picker-view-column class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.tmonths" :key="index">{{item}}月</view>
</picker-view-column>
<picker-view-column class="w-picker-flex2">
<view class="w-picker-item" v-for="(item,index) in range.tdays" :key="index">{{item}}</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],
default() {
return []
},
},
current: {
//是否默认选中当前日期
type: Boolean,
default: false,
},
startYear: {
type: [String, Number],
default: 1970,
},
endYear: {
type: [String, Number],
default: new Date().getFullYear(),
},
},
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}$/,
example = '2020-04-03'
if (!strReg.test(value[0]) || !strReg.test(value[1])) {
console.log(new Error('请传入与mode匹配的value值例[' + example + ',' + example + ']'))
}
return strReg.test(value[0]) && strReg.test(value[1])
},
resetToData(fmonth, fday, tyear, tmonth) {
let range = this.range
let tmonths = [],
tdays = []
let yearFlag = tyear != range.tyears[0]
let monthFlag = tyear != range.tyears[0] || tmonth != range.tmonths[0]
let ttotal = new Date(tyear, tmonth, 0).getDate()
for (let i = yearFlag ? 1 : fmonth * 1; i <= 12; i++) {
tmonths.push(this.formatNum(i))
}
for (let i = monthFlag ? 1 : fday * 1; i <= ttotal; i++) {
tdays.push(this.formatNum(i))
}
return {
tmonths,
tdays,
}
},
resetData(fyear, fmonth, fday, tyear, tmonth) {
let fyears = [],
fmonths = [],
fdays = [],
tyears = [],
tmonths = [],
tdays = []
let startYear = this.startYear
let endYear = this.endYear
let ftotal = new Date(fyear, fmonth, 0).getDate()
let ttotal = new Date(tyear, tmonth, 0).getDate()
for (let i = startYear * 1; i <= endYear; i++) {
fyears.push(this.formatNum(i))
}
for (let i = 1; i <= 12; i++) {
fmonths.push(this.formatNum(i))
}
for (let i = 1; i <= ftotal; i++) {
fdays.push(this.formatNum(i))
}
for (let i = fyear * 1; i <= endYear; i++) {
tyears.push(this.formatNum(i))
}
for (let i = fmonth * 1; i <= 12; i++) {
tmonths.push(this.formatNum(i))
}
for (let i = fday * 1; i <= ttotal; i++) {
tdays.push(this.formatNum(i))
}
return {
fyears,
fmonths,
fdays,
tyears,
tmonths,
tdays,
}
},
getData(dVal) {
let start = this.startYear * 1
let end = this.endYear * 1
let value = dVal
let flag = this.current
let aToday = new Date()
let tYear,
tMonth,
tDay,
tHours,
tMinutes,
tSeconds,
pickVal = []
let initstartDate = new Date(start.toString())
let endDate = new Date(end.toString())
if (start > end) {
initstartDate = new Date(end.toString())
endDate = new Date(start.toString())
}
let startYear = initstartDate.getFullYear()
let startMonth = initstartDate.getMonth() + 1
let endYear = endDate.getFullYear()
let fyears = [],
fmonths = [],
fdays = [],
tyears = [],
tmonths = [],
tdays = [],
returnArr = [],
startDVal = [],
endDVal = []
let curMonth = flag ? value[1] * 1 : startDVal[1] * 1 + 1
let curMonth1 = flag ? value[5][1] * 1 : value[5] * 1 + 1
let totalDays = new Date(value[0], value[1], 0).getDate()
let totalDays1 = new Date(value[4], value[5], 0).getDate()
for (let s = startYear; s <= endYear; s++) {
fyears.push(this.formatNum(s))
}
for (let m = 1; m <= 12; m++) {
fmonths.push(this.formatNum(m))
}
for (let d = 1; d <= totalDays; d++) {
fdays.push(this.formatNum(d))
}
for (let s = value[0] * 1; s <= endYear; s++) {
tyears.push(this.formatNum(s))
}
if (value[4] * 1 > value[0] * 1) {
for (let m = 1; m <= 12; m++) {
tmonths.push(this.formatNum(m))
}
for (let d = 1; d <= totalDays1; d++) {
tdays.push(this.formatNum(d))
}
} else {
for (let m = value[1] * 1; m <= 12; m++) {
tmonths.push(this.formatNum(m))
}
for (let d = value[2] * 1; d <= totalDays1; d++) {
tdays.push(this.formatNum(d))
}
}
pickVal = [
fyears.indexOf(value[0]) == -1 ? 0 : fyears.indexOf(value[0]),
fmonths.indexOf(value[1]) == -1 ? 0 : fmonths.indexOf(value[1]),
fdays.indexOf(value[2]) == -1 ? 0 : fdays.indexOf(value[2]),
0,
tyears.indexOf(value[4]) == -1 ? 0 : tyears.indexOf(value[4]),
tmonths.indexOf(value[5]) == -1 ? 0 : tmonths.indexOf(value[5]),
tdays.indexOf(value[6]) == -1 ? 0 : tdays.indexOf(value[6]),
]
return {
fyears,
fmonths,
fdays,
tyears,
tmonths,
tdays,
pickVal,
}
},
getDval() {
let value = this.value
let fields = this.fields
let dVal = null
let aDate = new Date()
let fyear = this.formatNum(aDate.getFullYear())
let fmonth = this.formatNum(aDate.getMonth() + 1)
let fday = this.formatNum(aDate.getDate())
let tyear = this.formatNum(aDate.getFullYear())
let tmonth = this.formatNum(aDate.getMonth() + 1)
let tday = this.formatNum(aDate.getDate())
if (value && value.length > 0) {
let flag = this.checkValue(value)
if (!flag) {
dVal = [fyear, fmonth, fday, '-', tyear, tmonth, tday]
} else {
dVal = [...value[0].split('-'), '-', ...value[1].split('-')]
}
} else {
dVal = [fyear, fmonth, fday, '-', tyear, tmonth, tday]
}
return dVal
},
initData() {
let range = [],
pickVal = []
let result = '',
full = '',
obj = {}
let dVal = this.getDval()
let dateData = this.getData(dVal)
let fyears = [],
fmonths = [],
fdays = [],
tyears = [],
tmonths = [],
tdays = []
let fyear, fmonth, fday, tyear, tmonth, tday
pickVal = dateData.pickVal
fyears = dateData.fyears
fmonths = dateData.fmonths
fdays = dateData.fdays
tyears = dateData.tyears
tmonths = dateData.tmonths
tdays = dateData.tdays
range = {
fyears,
fmonths,
fdays,
tyears,
tmonths,
tdays,
}
fyear = range.fyears[pickVal[0]]
fmonth = range.fmonths[pickVal[1]]
fday = range.fdays[pickVal[2]]
tyear = range.tyears[pickVal[4]]
tmonth = range.tmonths[pickVal[5]]
tday = range.tdays[pickVal[6]]
obj = {
fyear,
fmonth,
fday,
tyear,
tmonth,
tday,
}
result = full = `${fyear + '-' + fmonth + '-' + fday + '至' + tyear + '-' + tmonth + '-' + tday}`
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 result = '',
full = '',
obj = {}
let year = '',
month = '',
day = '',
hour = '',
minute = '',
second = '',
note = [],
province,
city,
area
let checkObj = this.checkObj
let days = [],
months = [],
endYears = [],
endMonths = [],
endDays = [],
startDays = []
let mode = this.mode
let col1, col2, col3, d, a, h, m
let xDate = new Date().getTime()
let range = this.range
let fyear = range.fyears[arr[0]] || range.fyears[range.fyears.length - 1]
let fmonth = range.fmonths[arr[1]] || range.fmonths[range.fmonths.length - 1]
let fday = range.fdays[arr[2]] || range.fdays[range.fdays.length - 1]
let tyear = range.tyears[arr[4]] || range.tyears[range.tyears.length - 1]
let tmonth = range.tmonths[arr[5]] || range.tmonths[range.tmonths.length - 1]
let tday = range.tdays[arr[6]] || range.tdays[range.tdays.length - 1]
let resetData = this.resetData(fyear, fmonth, fday, tyear, tmonth)
if (fyear != checkObj.fyear || fmonth != checkObj.fmonth || fday != checkObj.fday) {
arr[4] = 0
arr[5] = 0
arr[6] = 0
range.tyears = resetData.tyears
range.tmonths = resetData.tmonths
range.tdays = resetData.tdays
tyear = range.tyears[0]
checkObj.tyears = range.tyears[0]
tmonth = range.tmonths[0]
checkObj.tmonths = range.tmonths[0]
tday = range.tdays[0]
checkObj.tdays = range.tdays[0]
}
if (fyear != checkObj.fyear || fmonth != checkObj.fmonth) {
range.fdays = resetData.fdays
}
if (tyear != checkObj.tyear) {
arr[5] = 0
arr[6] = 0
let toData = this.resetToData(fmonth, fday, tyear, tmonth)
range.tmonths = toData.tmonths
range.tdays = toData.tdays
tmonth = range.tmonths[0]
checkObj.tmonths = range.tmonths[0]
tday = range.tdays[0]
checkObj.tdays = range.tdays[0]
}
if (tmonth != checkObj.tmonth) {
arr[6] = 0
let toData = this.resetToData(fmonth, fday, tyear, tmonth)
range.tdays = toData.tdays
tday = range.tdays[0]
checkObj.tdays = range.tdays[0]
}
result = full = `${fyear + '-' + fmonth + '-' + fday + '至' + tyear + '-' + tmonth + '-' + tday}`
obj = {
fyear,
fmonth,
fday,
tyear,
tmonth,
tday,
}
this.checkObj = obj
this.$nextTick(() => {
this.pickVal = arr
})
this.$emit('change', {
result: result,
value: full,
obj: obj,
})
},
},
}
</script>
<style lang="scss">
@import './w-picker.css';
</style>