123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- <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=`${fyear+'-'+fmonth+'-'+fday+'至'+tyear+'-'+tmonth+'-'+tday}`;
- this.range=range;
- this.checkObj=obj;
- this.$nextTick(()=>{
- this.pickVal=pickVal;
- });
- this.$emit("change",{
- result:result,
- value:result.split("至"),
- 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=`${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:result.split("至"),
- obj:obj
- })
-
- }
- }
- }
- </script>
- <style lang="scss">
- @import "./w-picker.css";
- </style>
|