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.
195 lines
4.0 KiB
195 lines
4.0 KiB
<template>
|
|
<view class="datatime">
|
|
<picker
|
|
mode="multiSelector"
|
|
:range="range"
|
|
range-key="text"
|
|
@change="change"
|
|
@columnchange="columnchange"
|
|
:value="value"
|
|
class="item-bootom1"
|
|
>
|
|
<view class="uni-input1">
|
|
<view class="pickerText1" :class="{selectTrue1:!dateStr}">
|
|
{{dateStr?dateStr:placeholder}}
|
|
</view>
|
|
<view class="pickerSelect1">选择</view>
|
|
</view>
|
|
</picker>
|
|
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
// 占位符
|
|
placeholder: {
|
|
type: String,
|
|
default: '请选择'
|
|
},
|
|
// 表示有效日期时间范围的开始,
|
|
// 字符串格式为 "YYYY-MM"
|
|
start: {
|
|
type: String,
|
|
default: '1950-01'
|
|
},
|
|
// 表示有效日期时间范围的结束
|
|
// 字符串格式为 "YYYY-MM"
|
|
end: {
|
|
type: String,
|
|
default: '2300-12'
|
|
},
|
|
// 字符串格式为 "YYYY-MM"
|
|
defaultValue: {
|
|
type: String,
|
|
default: ''
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
range: [
|
|
[],
|
|
[]
|
|
],
|
|
value: [],
|
|
dateStr: '', // 最终显示的字符串
|
|
dtStart: null, // 有效范围开始
|
|
dtEnd: null, // 有效范围结束
|
|
range_m: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
|
|
};
|
|
},
|
|
watch: {
|
|
// 默认值
|
|
defaultValue() {
|
|
// 设置默认值
|
|
this.setDefaultValue();
|
|
}
|
|
},
|
|
created() {
|
|
// 有效日期开始和结束
|
|
this.dtStart = this.start;
|
|
this.dtEnd = this.end;
|
|
this.getlist()
|
|
},
|
|
methods: {
|
|
getlist: function() {
|
|
let start_y = this.dtStart.slice(0, 4)
|
|
let end_y = +this.dtEnd.slice(0, 4)
|
|
for (let i = start_y; i < end_y + 1; i++) {
|
|
this.range[0].push(i + "年")
|
|
}
|
|
for (let j = 1; j < 13; j++) {
|
|
this.range[1].push(j + "月")
|
|
}
|
|
this.setDefaultValue()
|
|
},
|
|
columnchange: function(e) {
|
|
if (e.detail.column == 0) {
|
|
this.value[0] = e.detail.value
|
|
this.value[1] = 0
|
|
this.$set(this.value, 1, 0)
|
|
} else {
|
|
this.value[1] = e.detail.value
|
|
}
|
|
this.getmoth()
|
|
},
|
|
change: function(e) {
|
|
let aa = e.detail.value
|
|
let _new_y = this.range[0][aa[0]].slice(0, 4) + "-"
|
|
let _new_m = this.range[1][aa[1]].slice(0, 2)
|
|
this.$emit("change", _new_y + _new_m)
|
|
},
|
|
setDefaultValue: function() {
|
|
let _this = this
|
|
let new_y = ""
|
|
let new_m = ""
|
|
if (this.defaultValue) {
|
|
new_y = this.defaultValue.slice(0, 4)
|
|
new_m = this.defaultValue.slice(5, 7)
|
|
this.dateStr = new_y + "-" + new_m.padStart(2, "0")
|
|
} else {
|
|
let d = new Date()
|
|
new_y = this.dtStart.slice(0, 4)
|
|
new_m = this.dtStart.slice(5, 7)
|
|
}
|
|
this.range.forEach(arritem => {
|
|
arritem.forEach((item, index) => {
|
|
if (item == new_y + "年") {
|
|
_this.value[0] = index
|
|
}
|
|
if (item == new_m + "月") {
|
|
_this.value[1] = index
|
|
}
|
|
})
|
|
})
|
|
|
|
this.getmoth()
|
|
},
|
|
getmoth: function() {
|
|
if (this.range[0][this.value[0]] == this.dtStart.slice(0, 4) + "年") {
|
|
let start_m = +this.dtStart.slice(5, 7)
|
|
this.range[1] = this.range[1].slice(start_m - 1, 12)
|
|
} else if (this.range[0][this.value[0]] == this.dtEnd.slice(0, 4) + "年") {
|
|
let end_m = +this.dtEnd.slice(5, 7)
|
|
this.range[1] = this.range[1].slice(0, end_m)
|
|
} else {
|
|
this.range[1] = []
|
|
this.range_m.forEach(item => {
|
|
this.range[1].push(item)
|
|
})
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.item-bootom1 {
|
|
height: 80rpx;
|
|
padding: 0px 8rpx;
|
|
|
|
font-size: 32rpx;
|
|
|
|
&.input {
|
|
color: #007AFF;
|
|
}
|
|
}
|
|
|
|
.uni-input1 {
|
|
height: 80rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
border-bottom: 1rpx solid #d9d9d9;
|
|
}
|
|
|
|
.pickerText1 {
|
|
flex: 1;
|
|
height: 80rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
color: #4399FC;
|
|
font-size: 32rpx;
|
|
}
|
|
|
|
.pickerSelect1 {
|
|
color: #007AFF;
|
|
}
|
|
|
|
.itemText1 {
|
|
// width: 160rpx;
|
|
height: 60rpx;
|
|
padding: 0px 16rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background-color: #d2d2d2;
|
|
color: #007AFF;
|
|
}
|
|
|
|
.selectTrue1 {
|
|
color: #b1b1b1 !important;
|
|
}
|
|
</style>
|
|
|