219 lines
5.8 KiB
Vue
219 lines
5.8 KiB
Vue
<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.hours" :key="index">{{item}}时</view>
|
||
</picker-view-column>
|
||
<picker-view-column>
|
||
<view class="w-picker-item" v-for="(item,index) in range.minutes" :key="index">{{item}}分</view>
|
||
</picker-view-column>
|
||
<picker-view-column v-if="second">
|
||
<view class="w-picker-item" v-for="(item,index) in range.seconds" :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,Number],
|
||
default:""
|
||
},
|
||
current:{//是否默认选中当前日期
|
||
type:Boolean,
|
||
default:false
|
||
},
|
||
second:{
|
||
type:Boolean,
|
||
default:true
|
||
}
|
||
},
|
||
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{2}:\d{2}:\d{2}$/,example="18:00:05";
|
||
if(!strReg.test(value)){
|
||
console.log(new Error("请传入与mode、fields匹配的value值,例value="+example+""))
|
||
}
|
||
return strReg.test(value);
|
||
},
|
||
resetData(year,month,day,hour,minute){
|
||
let curDate=this.getCurrenDate();
|
||
let curFlag=this.current;
|
||
let curHour=curDate.curHour;
|
||
let curMinute=curDate.curMinute;
|
||
let curSecond=curDate.curSecond;
|
||
for(let hour=0;hour<24;hour++){
|
||
hours.push(this.formatNum(hour));
|
||
}
|
||
for(let minute=0;minute<60;minute++){
|
||
minutes.push(this.formatNum(minute));
|
||
}
|
||
for(let second=0;second<60;second++){
|
||
seconds.push(this.formatNum(second));
|
||
}
|
||
return{
|
||
hours,
|
||
minutes,
|
||
seconds
|
||
}
|
||
},
|
||
getData(curDate){
|
||
//用来处理初始化数据
|
||
let hours=[],minutes=[],seconds=[];
|
||
let curFlag=this.current;
|
||
let disabledAfter=this.disabledAfter;
|
||
let fields=this.fields;
|
||
let curHour=curDate.curHour;
|
||
let curMinute=curDate.curMinute;
|
||
let curSecond=curDate.curSecond;
|
||
for(let hour=0;hour<24;hour++){
|
||
hours.push(this.formatNum(hour));
|
||
}
|
||
for(let minute=0;minute<60;minute++){
|
||
minutes.push(this.formatNum(minute));
|
||
}
|
||
for(let second=0;second<60;second++){
|
||
seconds.push(this.formatNum(second));
|
||
}
|
||
return this.second?{
|
||
hours,
|
||
minutes,
|
||
seconds
|
||
}:{
|
||
hours,
|
||
minutes
|
||
}
|
||
},
|
||
getCurrenDate(){
|
||
let curDate=new Date();
|
||
let curHour=curDate.getHours();
|
||
let curMinute=curDate.getMinutes();
|
||
let curSecond=curDate.getSeconds();
|
||
return this.second?{
|
||
curHour,
|
||
curMinute,
|
||
curSecond
|
||
}:{
|
||
curHour,
|
||
curMinute,
|
||
}
|
||
},
|
||
getDval(){
|
||
let value=this.value;
|
||
let fields=this.fields;
|
||
let dVal=null;
|
||
let aDate=new Date();
|
||
let hour=this.formatNum(aDate.getHours());
|
||
let minute=this.formatNum(aDate.getMinutes());
|
||
let second=this.formatNum(aDate.getSeconds());
|
||
if(value){
|
||
let flag=this.checkValue(value);
|
||
if(!flag){
|
||
dVal=[hour,minute,second]
|
||
}else{
|
||
dVal=value?value.split(":"):[];
|
||
}
|
||
}else{
|
||
dVal=this.second?[hour,minute,second]:[hour,minute]
|
||
}
|
||
return dVal;
|
||
},
|
||
initData(){
|
||
let curDate=this.getCurrenDate();
|
||
let dateData=this.getData(curDate);
|
||
let pickVal=[],obj={},full="",result="",hour="",minute="",second="";
|
||
let dVal=this.getDval();
|
||
let curFlag=this.current;
|
||
let disabledAfter=this.disabledAfter;
|
||
let hours=dateData.hours;
|
||
let minutes=dateData.minutes;
|
||
let seconds=dateData.seconds;
|
||
let defaultArr=this.second?[
|
||
dVal[0]&&hours.indexOf(dVal[0])!=-1?hours.indexOf(dVal[0]):0,
|
||
dVal[1]&&minutes.indexOf(dVal[1])!=-1?minutes.indexOf(dVal[1]):0,
|
||
dVal[2]&&seconds.indexOf(dVal[2])!=-1?seconds.indexOf(dVal[2]):0
|
||
]:[
|
||
dVal[0]&&hours.indexOf(dVal[0])!=-1?hours.indexOf(dVal[0]):0,
|
||
dVal[1]&&minutes.indexOf(dVal[1])!=-1?minutes.indexOf(dVal[1]):0
|
||
];
|
||
pickVal=disabledAfter?defaultArr:(curFlag?(this.second?[
|
||
hours.indexOf(this.formatNum(curDate.curHour)),
|
||
minutes.indexOf(this.formatNum(curDate.curMinute)),
|
||
seconds.indexOf(this.formatNum(curDate.curSecond)),
|
||
]:[
|
||
hours.indexOf(this.formatNum(curDate.curHour)),
|
||
minutes.indexOf(this.formatNum(curDate.curMinute))
|
||
]):defaultArr);
|
||
this.range=dateData;
|
||
this.checkObj=obj;
|
||
hour=dVal[0]?dVal[0]:hours[0];
|
||
minute=dVal[1]?dVal[1]:minutes[0];
|
||
if(this.second)second=dVal[2]?dVal[0]:seconds[0];
|
||
result=this.second?`${hour+':'+minute+':'+second}`:`${hour+':'+minute}`;
|
||
full=this.second?`${hour+':'+minute+':'+second}`:`${hour+':'+minute+':00'}`;
|
||
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 hour="",minute="",second="",result="",full="",obj={};
|
||
hour=(arr[0]||arr[0]==0)?data.hours[arr[0]]||data.hours[data.hours.length-1]:"";
|
||
minute=(arr[1]||arr[1]==0)?data.minutes[arr[1]]||data.minutes[data.minutes.length-1]:"";
|
||
if(this.second)second=(arr[2]||arr[2]==0)?data.seconds[arr[2]]||data.seconds[data.seconds.length-1]:"";
|
||
obj=this.second?{
|
||
hour,
|
||
minute,
|
||
second
|
||
}:{
|
||
hour,
|
||
minute
|
||
};
|
||
this.checkObj=obj;
|
||
result=this.second?`${hour+':'+minute+':'+second}`:`${hour+':'+minute}`;
|
||
full=this.second?`${hour+':'+minute+':'+second}`:`${hour+':'+minute+':00'}`;
|
||
this.$emit("change",{
|
||
result:result,
|
||
value:full,
|
||
obj:obj
|
||
})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
@import "./w-picker.css";
|
||
</style>
|
||
|