基于Vant UI框架实现时间段选择器

本文实例为大家分享了Vant UI框架实现时间段选择器的具体代码,供大家参考,具体内容如下

组件代码如下:

<template>
 <van-picker
   :title=\"title\"
   :show-toolbar=\"showToolbar\"
   :columns=\"columns\"
   @confirm=\"onConfirm\"
   @cancel=\"onCancel\"
   @change=\"onChange\"
   :confirm-button-text=\"confirmButtonText\"
   :cancel-button-text=\"cancelButtonText\"
   :loading=\"loading\"
   :readonly=\"readonly\"
   :item-height=\"itemHeight\"
   :visible-item-count=\"visibleItemCount\"
   :swipe-duration=\"swipeDuration\"
 >
  <template slot=\"default\">
   <slot name=\"default\"></slot>
  </template>
  <template slot=\"title\">
   <slot name=\"title\"></slot>
  </template>
  <template slot=\"confirm\">
   <slot name=\"confirm\"></slot>
  </template>
  <template slot=\"cancel\">
   <slot name=\"cancel\"></slot>
  </template>
  <template slot=\"option\">
   <slot name=\"option\"></slot>
  </template>
  <template slot=\"columns-top\">
   <slot name=\"columns-top\"></slot>
  </template>
  <template slot=\"columns-bottom\">
   <slot name=\"columns-bottom\"></slot>
  </template>
 </van-picker>
</template>

<script>
 import Vue from \'vue\'
 import { Field, Picker, Popup } from \'vant\';
 Vue.use(Field).use(Picker).use(Popup);

 export default {
  name: \"VanDatePicker\",
  props: {
   value: {
    type: Date,
    default: () => new Date()
   },
   minDate: {
    type: Date,
    default: () => new Date(new Date().getFullYear()-5,0,1)
   },
   maxDate: {
    type: Date,
    default: () => new Date(new Date().getFullYear()+5,0,1)
   },
   showToolbar: {
    type: Boolean,
    default: () => false
   },
   title: {
    type: String,
    default: () => \'\'
   },
   confirmButtonText: {
    type: String,
    default: () => \'确认\'
   },
   cancelButtonText: {
    type: String,
    default: () => \'取消\'
   },
   loading: {
    type: Boolean,
    default: () => false
   },
   readonly: {
    type: Boolean,
    default: () => false
   },
   itemHeight: {
    type: Number||String,
    default: () => 44
   },
   visibleItemCount: {
    type: Number||String,
    default: () => 6
   },
   swipeDuration: {
    type: Number||String,
    default: () => 1000
   },
  },
  data() {
   return {
    monthArr: [\'01\', \'02\', \'03\', \'04\', \'05\', \'06\', \'07\', \'08\', \'09\', \'10\', \'11\', \'12\'],
    dayArr: [\'01\', \'02\', \'03\', \'04\', \'05\', \'06\', \'07\', \'08\', \'09\', \'10\', \'11\', \'12\',\'13\', \'14\', \'15\', \'16\', \'17\', \'18\', \'19\', \'20\', \'21\', \'22\', \'23\', \'24\',\'25\', \'26\', \'27\', \'28\', \'29\', \'30\', \'31\'],
   };
  },
  
  computed: {
   columns: function () {
    let minYear = this.minDate.getFullYear();
    let maxYear = this.maxDate.getFullYear();
    let year = this.value.getFullYear();
    let month = this.value.getMonth();
    let day = this.value.getDate();
    let yearArr = [];
    let i = 0;
    while (i < maxYear - minYear + 1) {
     yearArr.unshift((maxYear - i) + \'\');
     i ++;
    }
    let columns = [
     {
      values: yearArr,
      defaultIndex: Math.floor(year) - minYear
     },
     {
      values: this.monthArr,
      defaultIndex: Math.floor(month)
     },
     {
      values: this.dayArr,
      defaultIndex: Math.floor(day-1)
     },
     {
      values: [\'-\']
     },
     {
      values: yearArr,
      defaultIndex: Math.floor(year) - minYear
     },
     {
      values: this.monthArr,
      defaultIndex: Math.floor(month)
     },
     {
      values: this.dayArr,
      defaultIndex: Math.floor(day-1)
     },
    ];
    return columns
   }
  },

  watch: {

  },
  
  methods: {
   onConfirm(value, index) {
    // console.log(`当前值:${value}, 当前索引:${index}`);
    this.$emit(\'confirm\',value,index);
   },
   onChange(picker, value, index) {
    // console.log(`当前值:${value}, 当前索引:${index}`);
    let _this = this;

    let minMonth = this.minDate.getMonth();
    let minDay = this.minDate.getDate();
    let maxMonth = this.maxDate.getMonth();
    let maxDay = this.maxDate.getDate();
    let d = new Date(value[0],value[1],0);

    setDate(0);
    setDate(4);
    function setDate(i) {
     //最小年份
     if (value[i]-0===_this.minDate.getFullYear()) {
      picker.setColumnValues(i+1,_this.monthArr.slice(minMonth));
      let strMinM = \'\';
      if (minMonth<9) {
       strMinM = \'0\'+(minMonth+1)
      } else {
       strMinM = strMinM + 1 + \'\'
      }
      picker.setColumnValue(i+1,value[i+1]-1<minMonth?strMinM:value[i+1]);

      if (index===i&&value[i+1]-1<minMonth) {
       picker.setColumnValues(i+2,_this.dayArr.slice(minDay-1,d.getDate()));
       picker.setColumnValue(i+2,value[i+2]<minDay?minDay.toString():value[i+2]);
      } else {
       if (value[i+1]-1===_this.minDate.getMonth()) {
        picker.setColumnValues(i+2,_this.dayArr.slice(minDay-1,d.getDate()));
        picker.setColumnValue(i+2,value[i+2]<minDay?minDay.toString():value[i+2]);
       } else {
        picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));
        picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);
       }
      }
     }
     //最大年份
     else if (value[i]-0===_this.maxDate.getFullYear()) {
      picker.setColumnValues(i+1,_this.monthArr.slice(0,maxMonth+1));
      let strManM = \'\';
      if (maxMonth<9) {
       strManM = \'0\'+(maxMonth+1)
      } else {
       strManM = maxMonth + 1 + \'\'
      }
      picker.setColumnValue(i+1,value[i+1]-1>maxMonth?strManM:value[i+1]);
      if (index===i&&value[i+1]-1>maxMonth) {
       picker.setColumnValues(i+2,_this.dayArr.slice(0,maxDay));
       picker.setColumnValue(i+2,value[i+2]>maxDay?maxDay.toString():value[i+2]);
      } else {
       if (value[i+1]-1===_this.maxDate.getMonth()) {
        picker.setColumnValues(i+2,_this.dayArr.slice(0,maxDay));
        picker.setColumnValue(i+2,value[i+2]>maxDay?maxDay.toString():value[i+2]);
       } else {
        picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));
        picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);
       }
      }
     }
     //其他年份
     else {
      picker.setColumnValues(i+1,_this.monthArr);
      picker.setColumnValue(i+1,value[i+1]);
      picker.setColumnValues(i+2,_this.dayArr.slice(0,d.getDate()));
      picker.setColumnValue(i+2,value[i+2]>d.getDate()?d.getDate().toString():value[i+2]);
     }
    }

    let finallyVal = picker.getValues();
    let len = Math.floor(finallyVal.length/2);
    //开始时间不大于结束时间
    if (finallyVal.slice(0,len).join(\"\")>finallyVal.slice(len+1).join(\"\")){
     picker.setValues([...finallyVal.slice(0,len),\"-\",...finallyVal.slice(0,len)]);
     if (new Date(finallyVal.slice(0,len).join(\"-\")+\' 00:00:00\').getTime()===this.maxDate.getTime()) {
      console.log(111);
      picker.setColumnValues(5,_this.monthArr.slice(0,maxMonth+1));
      picker.setColumnValues(6,_this.dayArr.slice(0,maxDay));
     }
    }

    this.$emit(\'change\',picker,finallyVal,index);
   },
   onCancel() {
    // console.log(\'取消\');
    this.$emit(\'cancel\');
   },
  },
 }
</script>

<style scoped>

</style>

调用demo

<template>
 <div>
  <van-field
    readonly
    clickable
    label=\"时间段\"
    :value=\"value\"
    placeholder=\"选择时间段\"
    @click=\"showPicker = true\"
  />
  <van-popup v-model=\"showPicker\" round position=\"bottom\">
   <van-date-picker
     show-toolbar
     v-model=\"currentDate\"
  title=\"选择时间段\"
     :min-date=\"minDate\"
     :max-date=\"maxDate\"
     @cancel=\"showPicker = false\"
     @confirm=\"onConfirm\"
     @change=\"onChange\"
   >
   </van-date-picker>
  </van-popup>
 </div>
</template>

<script>
 import VanDatePicker from \'@/components/VanDatePicker\';

 export default {
  name: \"Test\",
  components: {VanDatePicker},
  data() {
   return {
    value: \'\',
    showPicker: false,
    minDate: new Date(2010, 5, 15),
    maxDate: new Date(2025, 10, 15),
    currentDate: new Date(),
    startDate: \'\',
    endDate: \'\',
   };
  },

  mounted() {

  },

  methods: {
   onConfirm(value, index) {
    console.log(`当前值:${value}, 当前索引:${index}`);
    this.startDate = value.slice(0,3).join(\'-\');
    this.endDate = value.slice(4,7).join(\'-\');
    this.value = this.startDate + \'至\' + this.endDate;
    this.showPicker = false
   },

   onChange(picker, value, index) {
    console.log(`当前值:${value}, 当前索引:${index}`);
   },
  },
 }
</script>

<style scoped>

</style>

UI示例

基于Vant UI框架实现时间段选择器

API:注意红色划掉的没有实现

基于Vant UI框架实现时间段选择器

基于Vant UI框架实现时间段选择器

基于Vant UI框架实现时间段选择器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容