前端項目框架搭建隨筆---DatePicker組件編寫

距離上次更新13天了。。。css


時間過的可真快vue



好的,讓咱們切入正題:git

今天咱們來作一個DatePicker(時間選擇器)github

如圖:web



因爲時間緊迫,只實現了傳入開始時間和結束時間的功能bash

使用插件:better-scrollydui的時間處理工具類app

咱們先上HTML和CSS代碼工具


HTML+CSS

<template>
    <div class="zb-picker--datetime-wrapper">
      <div class="zb-picker--datetime__indicator">
        <div class="indicator__top"></div>
        <div class="indicator__main"></div> // 中間的指示器
        <div class="indicator__bottom"></div>
      </div>
      <div class="zb-picker--datetime__header">
        <span>取消</span>
        <span>{{getSelectTime}}</span>
        <span>肯定</span>
      </div>
      <div class="zb-picker--datetime__content">
        <div class="picker--datetime-content__item datetime--years">
          <ul class="picker--datetime-content__item__box wheel-scroll">
            <li class="wheel-item" v-for="i in dateItem.yearsItem">{{i.name}}</li> //年份列表
          </ul>
        </div>
        <div class="picker--datetime-content__item datetime--months">
          <ul class="picker--datetime-content__item__box wheel-scroll">
            <li class="wheel-item" v-for="i in dateItem.monthsItem">{{i.name}}</li> //月份列表
          </ul>
        </div>
        <div class="picker--datetime-content__item datetime--days">
          <ul class="picker--datetime-content__item__box wheel-scroll">
            <li class="wheel-item" v-for="i in dateItem.daysItem">{{i.name}}</li> //天列表
          </ul>
        </div>
        <div class="picker--datetime-content__item datetime--hours">
          <ul class="picker--datetime-content__item__box wheel-scroll">
            <li class="wheel-item" v-for="i in dateItem.hoursItem">{{i.name}}</li> //時列表
          </ul>
        </div>
        <div class="picker--datetime-content__item datetime--mins">
          <ul class="picker--datetime-content__item__box wheel-scroll">
            <li class="wheel-item" v-for="i in dateItem.minsItem">{{i.name}}</li> //分列表
          </ul>
        </div>
      </div>
    </div>
</template>複製代碼

<style scoped>
  * {
    color: black;
  }

  .zb-picker--datetime-wrapper {
    transition: transform .25s, -webkit-transform .25s;
    touch-action: none;
    will-change: transform;
    z-index: 1600;
    position: fixed;
    bottom: 0;
    background-color: white;
    width: 100%;
  }

  .zb-picker--datetime__header {
    display: flex;
    justify-content: space-between;
    position: relative;
  }

  .zb-picker--datetime__header > span {
    align-items: center;
    padding: 1rem 2.6rem;
    font-size: 1.5rem;
    cursor: pointer;
    user-select: none;
  }

  .zb-picker--datetime__header > span:last-child {
    color: #1890FF;
  }

  .zb-picker--datetime__content {
    height: 22rem;
    display: flex;
    flex-direction: row;
  }

  .picker--datetime-content__item {
    flex: 1;
    text-align: center;
    overflow: hidden;
  }

  .picker--datetime-content__item > .picker--datetime-content__item__box {
    display: flex;
    flex-direction: column;
    margin-top: 9rem;
  }

  .picker--datetime-content__item__box > li {
    height: 3rem;
    line-height: 3rem;
    font-size: 1.3rem;
    user-select: none;
  }

  .zb-picker--datetime__indicator {
    position: absolute;
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    padding-top: 4rem;
  }

  .zb-picker--datetime__indicator .indicator__main {
    position: relative;
    /*border: 1px solid #ECECEC;*/
    border-right-width: 0;
    border-left-width: 0;
    flex: 1;
  }

  .indicator__top {
    z-index: 1600;
    pointer-events: none;
    flex: 4;
    background: linear-gradient(0deg, hsla(0, 0%, 100%, .4), hsla(0, 0%, 100%, .8));
  }

  .indicator__bottom {
    z-index: 1600;
    pointer-events: none;
    flex: 6;
    background: linear-gradient(0deg, hsla(0, 0%, 100%, .4), hsla(0, 0%, 100%, .8));
  }
</style>
複製代碼

data/props裏的變量:
flex

props: {
  startTime: { // 開始時間
    required: false
  },
  endTime: { // 結束時間
    required: false
  }
},
data() {
  return {
    scrollParam: { //scroll通用參數
      scrollY: true,
      bounce: true,
      wheel: {
        selectedIndex: 0,
        rotate: 25,
        wheelWrapperClass: 'wheel-scroll',
        wheelItemClass: 'wheel-item'
      }
    },
    dateItem: {
      yearsItem: [], //年份列表
      monthsItem: [], //月份列表
      daysItem: [], //天數列表
      hoursItem: [], //時列表
      minsItem: [] //分列表
    },
    selectItem: {
      year: { //當前選擇的年份
        value: 0,
        index: 0
      },
      month: { //當前選擇的月份
        value: 0,
        index: 0
      },
      day: { //當前選擇的天
        value: 0,
        index: 0
      },
      hour: { //當前選擇的時
        value: 0,
        index: 0
      },
      min: { //當前選中的分
        value: 0,
        index: 0
      },
    }
  }
},複製代碼

還有兩個importui

import BScroll from 'better-scroll'
import dateUtils from '@/utils/tools/DateUtils'複製代碼複製代碼



實現思路

首先咱們先列出開發中的預知問題:

  1. 天數多月份向天數少月份轉換問題
  2. 開始時間和結束時間日期圈定
  3. 更改年份後同步更改子時間單位

看起來很容易解決,但串聯起來不容易

思考了半天,想了這麼一種解決思路:


仔細閱讀的小夥伴可能就瞭解了,我這種解決思路是層層遞減的。也就是選中我所選擇的單位時,只刷新他的子單位列表,不刷新父單位列表。


上代碼:

對此咱們二次封裝了一堆獲取日期列表的方法,供你們參考:

getYearsItems(startDate, endDate) { //獲取年列表
  return dateUtils.getYearItems({
    format: '{value}年',
    startDate: startDate ? startDate : '',
    endDate: endDate ? endDate : ''
  })
},
getMonthItems(currentYear, startDate, endDate) { //獲取月列表
  return dateUtils.getMonthItems({
    format: '{value}月',
    startDate: startDate ? startDate : '',
    endDate: endDate ? endDate : '',
    currentYear: currentYear ? currentYear : ''
  })
},
getDaysItems(currentYear, currentMonth, startDate, endDate) { //獲取天列表
  return dateUtils.getDayItems({
    format: '{value}日',
    startDate: startDate ? startDate : '',
    endDate: endDate ? endDate : '',
    currentYear: currentYear ? currentYear : '',
    currentMonth: currentMonth ? currentMonth : '',
  })
},
getHoursItems(currentYear, currentMonth, currentDay, startHour, endHour, startDate, endDate) {
  return dateUtils.getHourItems({ //獲取時列表
    format: '{value}時',
    startDate: startDate ? startDate : '',
    endDate: endDate ? endDate : '',
    currentYear: currentYear ? currentYear : '',
    currentMonth: currentMonth ? currentMonth : '',
    currentDay: currentDay ? currentDay : '',
    startHour: startHour ? startHour : 0,
    endHour: endHour ? endHour : 23
  })
},
getMinsItems(currentYear, currentMonth, currentDay, currentHour, startDate, endDate) {
  return dateUtils.getMinuteItems({ //獲取分列表
    format: '{value}分',
    startDate: startDate ? startDate : '',
    endDate: endDate ? endDate : '',
    currentYear: currentYear ? currentYear : '',
    currentMonth: currentMonth ? currentMonth : '',
    currentDay: currentDay ? currentDay : '',
    currentHour: currentHour ? currentHour : '',
  })
},複製代碼複製代碼


獲取時列表那裏還須要傳入開始時和結束時。空的話默認0時 - 23時


初始化:

mounted() {
  if (this.startTime && this.endTime) { //若是含有開始和結束時間
    this.dateItem.yearsItem = this.getYearsItems(this.startTime, this.endTime); //按照開始結束時間獲取年份列表
    this.dateItem.monthsItem = this.getMonthItems(new Date(this.startTime).getFullYear(),
      this.startTime, this.endTime); //同上
    this.dateItem.daysItem = this.getDaysItems(new Date(this.startTime).getFullYear(),
      new Date(this.startTime).getMonth() + 1,
      this.startTime, this.endTime);  //同上
    this.dateItem.hoursItem = this.getHoursItems(new Date(this.startTime).getFullYear(),
      new Date(this.startTime).getMonth() + 1,
      new Date(this.startTime).getDate(),
      new Date(this.startTime).getHours(), 23,
      this.startTime, this.endTime);  //同上
    this.dateItem.minsItem = this.getMinsItems(new Date(this.startTime).getFullYear(),
      new Date(this.startTime).getMonth() + 1,
      new Date(this.startTime).getDate(),
      new Date(this.startTime).getHours(),
      this.startTime, this.endTime)  //同上
  } else { //若是不存在開始結束時間
    this.dateItem.yearsItem = this.getYearsItems(); //默認爲空 獲取當前日期先後100年的時間
    this.dateItem.monthsItem = this.getMonthItems(); //默認爲空 獲取當前日期先後100年的時間
    this.dateItem.daysItem = this.getDaysItems(); //默認爲空 獲取當前日期先後100年的時間
    this.dateItem.hoursItem = this.getHoursItems();  //默認爲空 獲取當前日期先後100年的時間
    this.dateItem.minsItem = this.getMinsItems(); //默認爲空 獲取當前日期先後100年的時間
  }

  this.$nextTick(() => { //data更新後
    //初始化當前選擇項
    this.selectItem.year.value = this.dateItem.yearsItem[0].value; //獲取時間列表第一個的value給默認值
    this.selectItem.year.index = 0;  //初始化日期選擇列表的index爲0

    this.selectItem.month.value = this.dateItem.monthsItem[0].value;
    this.selectItem.month.index = 0;

    this.selectItem.day.value = this.dateItem.daysItem[0].value;
    this.selectItem.day.index = 0;

    this.selectItem.hour.value = this.dateItem.hoursItem[0].value;
    this.selectItem.hour.index = 0;

    this.selectItem.min.value = this.dateItem.minsItem[0].value;
    this.selectItem.min.index = 0;

    this.initScroll();  //初始化scroll
  });
},複製代碼

註釋已經寫的很清楚了~~~~



接下來咱們以年列表滾動監聽事件爲註釋例子,方便你們理解(initScroll方法):

let self = this; //新建變量從新指向this
//年列表滾動
let YearsScroll = new BScroll(document.getElementsByClassName("datetime--years")[0], this.scrollParam); //初始化scroll
YearsScroll.on('scrollEnd', () => { //scrollEnd監聽事件
  let selectYear = self.dateItem.yearsItem[YearsScroll.getSelectedIndex()].value; //獲取當前選中的年份
  let selectMonth = self.dateItem.monthsItem[MonthsScroll.getSelectedIndex()].value; //獲取當前選中的月份
  let selectDay = self.selectItem.day.value;  //獲取當前選中的天
  self.selectItem.year.value = selectYear; //更新選中的年份
  self.selectItem.year.index = YearsScroll.getSelectedIndex();  //更新選中的年份
  if (self.startTime && self.endTime) {  //若是有開始結束日期
    if (new Date(self.startTime).getFullYear() === selectYear) { //若是開始年份===當前選擇年份
      self.$nextTick(() => {
        // 從新刷新月份列表 傳入開始日期的年份,開始的時間和結束時間
        self.dateItem.monthsItem = self.getMonthItems(new Date(self.startTime).getFullYear(), self.startTime, self.endTime);
        // 更新當前選中月份
        self.fixMonthDateBug();
      });
      self.$nextTick(() => {
        // 從新刷新天份列表 傳入開始日期的年份,開始時間的月份,開始的時間和結束時間
        self.dateItem.daysItem = self.getDaysItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          self.startTime, self.endTime);
        // 更新當前選中天
        self.fixDaysDateBug();
      });
      self.$nextTick(() => {
        // 從新刷新時列表 傳入開始日期的年份,開始時間的月份,開始時間的天份,開始時刻-23時。
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), 23);
        // 更新當前選中時
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        // 從新刷新分列表 傳入開始日期的年份,開始時間的月份,開始時間的天份,開始時刻,開始的時間和結束時間
        self.dateItem.minsItem = self.getMinsItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), self.startTime, self.endTime);
        // 更新當前選中分
        self.fixMinDateBug();
      });
      return false;
    } else if (new Date(self.endTime).getFullYear() === selectYear) { //若是是結束時間 與開始時間同理
      // 您選中了最後一個年份
      self.dateItem.monthsItem = self.getMonthItems(
        new Date(self.endTime).getFullYear(),
        self.startTime, self.endTime);
      self.$nextTick(() => {
        self.fixMonthDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.daysItem = self.getDaysItems(
          new Date(self.endTime).getFullYear(),
          self.startTime, self.endTime);
        self.fixDaysDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          0, new Date(self.endTime).getHours()); //由於是結束時間,因此時刻要從0-結束時間
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          new Date(self.endTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    }
  }
  //若是沒有傳入開始和結束時間
  self.dateItem.monthsItem = self.getMonthItems(selectYear, null, null); //根據當前選中的年份,更新月份列表
  self.$nextTick(() => {
    // 更新當前選中月份
    self.fixMonthDateBug();
  });
  self.$nextTick(() => {
    //根據當前選中的年份和月份,更新天份列表
    self.dateItem.daysItem = self.getDaysItems(selectYear, this.selectItem.month.value, null, null);
    self.fixDaysDateBug();
  });
  self.$nextTick(() => {
    // 簡單粗暴 0-23時
    self.dateItem.hoursItem = self.getHoursItems(null, null, null, 0, 23);
    self.fixHourDateBug();
  });
  self.$nextTick(() => {
    //根據當前選中的年份,月份,天,更新分份列表
    self.dateItem.minsItem = self.getMinsItems(selectYear, selectMonth, selectDay, null, null);
    self.fixMinDateBug();
  });
  return false;
});複製代碼


眼尖的小夥伴看出來了,對於從新選中選項的操做,單獨分了一個名爲fix****DateBug的方法,那咱們就繼續理解下列表更新,選中切換的思路

以自動切換月份當前選中爲例:

fixMonthDateBug() {
  if (!this.dateItem.monthsItem[this.selectItem.month.index]) {  // 若是當前選擇的月份index沒在當前的月份列表裏
    /*
    * 這裏要解釋一下:這種狀況說明當前選中的月份value和index都不在當前的月份列表內。
    * 例如:當前選擇的是7.31,選中index就是32。若是切換到2月份,月份有28天,index最長29。
    * 就找不到32這個index。因此直接賦值2月份最後一天。
    * 這是月份的邏輯。其餘同理還有「天」,「時」,「分」的同理邏輯。
    * 由於年是最大的單位,因此年不設置此邏輯
    * */
    this.selectItem.month.index = this.dateItem.monthsItem.length - 1;
    this.selectItem.month.value = this.dateItem.monthsItem[this.dateItem.monthsItem.length - 1].value
  } else { //若是在的話,只更新value值。
    this.selectItem.month.value = this.dateItem.monthsItem[this.selectItem.month.index].value
  }
},複製代碼複製代碼


這個操做是爲了解決:上次選擇的index超過本次列表的長度,致使沒有對應值問題。

解決思路:也就是當我上次選擇7.31日時,本次切換到2月份。然而2月份沒有31日,那咱們就從新指向選擇爲2月最後一天。


那麼咱們放出剩下的「月」,"天",「時」,「分」監聽事件(前方大量代碼來襲):

//月列表滾動
let MonthsScroll = new BScroll(document.getElementsByClassName("datetime--months")[0], this.scrollParam);
MonthsScroll.on('scrollEnd', () => {
  let selectYear = self.dateItem.yearsItem[YearsScroll.getSelectedIndex()].value;
  //選中的月份Value
  let selectMonth = self.dateItem.monthsItem[MonthsScroll.getSelectedIndex()].value;
  let selectDay = self.selectItem.day.value;
  self.selectItem.month.value = selectMonth;
  self.selectItem.month.index = MonthsScroll.getSelectedIndex();

  if (self.startTime && self.endTime) {
    if (MonthsScroll.getSelectedIndex() === 0 && new Date(self.startTime).getFullYear() === parseInt(selectYear)) {
      self.$nextTick(() => {
        self.dateItem.daysItem = self.getDaysItems(new Date(self.startTime).getFullYear(), new Date(self.startTime).getMonth() + 1, self.startTime, self.endTime);
        self.fixDaysDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), 23);
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    } else if (new Date(self.endTime).getMonth() + 1 === parseInt(selectMonth) && new Date(self.endTime).getFullYear() === parseInt(selectYear)) {
      self.$nextTick(() => {
        self.dateItem.daysItem = self.getDaysItems(new Date(self.endTime).getFullYear(), new Date(self.endTime).getMonth() + 1, self.startTime, self.endTime);
        self.fixDaysDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          0, new Date(self.endTime).getHours());
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          new Date(self.endTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    }
  }
  self.$nextTick(() => {
    self.dateItem.daysItem = self.getDaysItems(selectYear, selectMonth, null, null);
    self.fixDaysDateBug();
  });
  self.$nextTick(() => {
    self.dateItem.hoursItem = self.getHoursItems(null, null, null, 0, 24);
    self.fixHourDateBug();
  });
  self.$nextTick(() => {
    self.dateItem.minsItem = self.getMinsItems(selectYear, selectMonth, selectDay, null, null);
    self.fixMinDateBug();
  });
  return false;
});

//日列表滾動
let DaysScroll = new BScroll(document.getElementsByClassName("datetime--days")[0], this.scrollParam);
DaysScroll.on('scrollEnd', () => {
  self.selectItem.day.value = self.dateItem.daysItem[DaysScroll.getSelectedIndex()].value;
  self.selectItem.day.index = DaysScroll.getSelectedIndex();
  let selectYear = self.selectItem.year.value;
  let selectMonth = self.selectItem.month.value;
  let selectDay = self.selectItem.day.value;
  if (self.startTime && self.endTime) {
    if (new Date(self.startTime).getFullYear() === parseInt(selectYear)
      && new Date(self.startTime).getMonth() + 1 === parseInt(selectMonth)
      && new Date(self.startTime).getDate() === parseInt(selectDay)) {
      self.$nextTick(() => {
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), 23);
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    } else if (new Date(self.endTime).getFullYear() === parseInt(selectYear)
      && new Date(self.endTime).getMonth() + 1 === parseInt(selectMonth)
      && new Date(self.endTime).getDate() === parseInt(selectDay)) {
      self.$nextTick(() => {
        self.dateItem.hoursItem = self.getHoursItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          0, new Date(self.endTime).getHours());
        self.fixHourDateBug();
      });
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          new Date(self.endTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    }
  }
  self.dateItem.hoursItem = self.getHoursItems(null, null, null, 0, 24);
  self.$nextTick(() => {
    self.fixHourDateBug();
  });
  self.$nextTick(() => {
    self.dateItem.minsItem = self.getMinsItems(selectYear, selectMonth, selectDay, null, null);
    self.fixMinDateBug();
  });
  return false;
})

//時列表滾動
let HoursScroll = new BScroll(document.getElementsByClassName("datetime--hours")[0], this.scrollParam);
HoursScroll.on('scrollEnd', () => {
  self.selectItem.hour.value = self.dateItem.hoursItem[HoursScroll.getSelectedIndex()].value;
  self.selectItem.hour.index = HoursScroll.getSelectedIndex();
  let selectYear = self.selectItem.year.value;
  let selectMonth = self.selectItem.month.value;
  let selectDay = self.selectItem.day.value;
  let selectHour = self.selectItem.hour.value;
  if (self.startTime && self.endTime) {
    if (new Date(self.startTime).getFullYear() === parseInt(selectYear)
      && new Date(self.startTime).getMonth() + 1 === parseInt(selectMonth)
      && new Date(self.startTime).getDate() === parseInt(selectDay)
      && new Date(self.startTime).getHours() === parseInt(selectHour)) {
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.startTime).getFullYear(),
          new Date(self.startTime).getMonth() + 1,
          new Date(self.startTime).getDate(),
          new Date(self.startTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    } else if (new Date(self.endTime).getFullYear() === parseInt(selectYear)
      && new Date(self.endTime).getMonth() + 1 === parseInt(selectMonth)
      && new Date(self.endTime).getDate() === parseInt(selectDay)
      && new Date(self.endTime).getHours() === parseInt(selectHour)) {
      self.$nextTick(() => {
        self.dateItem.minsItem = self.getMinsItems(new Date(self.endTime).getFullYear(),
          new Date(self.endTime).getMonth() + 1,
          new Date(self.endTime).getDate(),
          new Date(self.endTime).getHours(), self.startTime, self.endTime);
        self.fixMinDateBug();
      });
      return false;
    }
  }
  self.$nextTick(() => {
    self.dateItem.minsItem = self.getMinsItems(selectYear, selectMonth, selectDay, null, null);
    self.fixMinDateBug();
  });
  return false;
})

//分列表滾動
let MinsScroll = new BScroll(document.getElementsByClassName("datetime--mins")[0], this.scrollParam);
MinsScroll.on('scrollEnd', () => {
  self.selectItem.min.value = self.dateItem.minsItem[MinsScroll.getSelectedIndex()].value;
  self.selectItem.min.index = MinsScroll.getSelectedIndex();
})複製代碼


注意:每個監聽事件,都是從新刷新子時間單位的列表並從新更改選擇項。因此代碼量從 」年「 到 」分「 是逐級遞減的


剩餘的日期選擇項更改邏輯:

fixDaysDateBug() {
  if (!this.dateItem.daysItem[this.selectItem.day.index]) {
    this.selectItem.day.index = this.dateItem.daysItem.length - 1;
    this.selectItem.day.value = this.dateItem.daysItem[this.dateItem.daysItem.length - 1].value
  } else {
    this.selectItem.day.value = this.dateItem.daysItem[this.selectItem.day.index].value
  }
},
fixHourDateBug() {
  if (!this.dateItem.hoursItem[this.selectItem.hour.index]) {
    this.selectItem.hour.index = this.dateItem.hoursItem.length - 1;
    this.selectItem.hour.value = this.dateItem.hoursItem[this.dateItem.hoursItem.length - 1].value
  } else {
    this.selectItem.hour.value = this.dateItem.hoursItem[this.selectItem.hour.index].value
  }
},
fixMinDateBug() {
  if (!this.dateItem.minsItem[this.selectItem.min.index]) {
    this.selectItem.min.index = this.dateItem.minsItem.length - 1;
    this.selectItem.min.value = this.dateItem.minsItem[this.dateItem.minsItem.length - 1].value
  } else {
    this.selectItem.min.value = this.dateItem.minsItem[this.selectItem.min.index].value
  }
},複製代碼



好了,到這裏一個功能基礎功能的時間選擇器(DatePicker)就作完了。組件代碼在碼雲上有託管。連接:點擊這裏


emmm.....求各位路過點個當心心唄~~

相關文章
相關標籤/搜索