国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器

這篇具有很好參考價值的文章主要介紹了記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器

  • npm包:sta-datepicker
  • 效果圖?

記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器

需求

普通的時間選擇器要么只能單選,要么只能選范圍,不可以隨意選擇若干個時間,同時大多數(shù)現(xiàn)成的時間選擇器選擇結(jié)束會收起來,很不方便?,F(xiàn)在需求如下 1、可以自己控制展開收起 2、可以選擇不連續(xù)的多個時間范圍的日期 3、可以批量選中日期,不需要一個個點(diǎn)擊

實(shí)現(xiàn)過程(分幾個步驟,具體可以看源碼)

1、生成一個日歷

  • 頂部為固定的幾個按鈕,可以綁定切換年份月份的函數(shù)

  • 中間為固定的星期,一個七個

  • 底部為具體日期,由三部分組成,即:上個月底幾天,這個月整個月,下個月初幾天

    • 算好平年閏年,輸出當(dāng)前月份第一天是周幾
    • 根據(jù)當(dāng)前月份的第一天的星期數(shù),計(jì)算日歷要展示上個月月底的幾天
    • 根據(jù)當(dāng)前月份最后一天的星期數(shù),計(jì)算日歷要展示下個月月初的幾天
  • 日期部分使用div遍歷三個數(shù)組,左浮動或者彈性盒直接堆起來即可

  created() {
    this.trueDateBox()
  },
  methods: {
    trueDateBox() {
      if (this.date === "") {
        const date = new Date()
        this.year = date.getFullYear()
        this.updateLeapYear()
        this.month = date.getMonth() + 1
        this.day = null
      }
      this.dayScreen()
    },
    // 設(shè)置算好閏年平年
    updateLeapYear() {
      if (this.isLeapYear(this.year)) {
        this.monthDay[1] = 29
      } else {
        this.monthDay[1] = 28
      }
    },
    isLeapYear(year) {
      return year % 100 === 0 ? year % 400 === 0 : year % 4 === 0
    },
    // 日期顯示
    dayScreen() {
      // 渲染上個月,第一行
      const firstDate = new Date(this.year, this.month - 1, 1)
      const firstWeek = firstDate.getDay()
      let preMonthDay = null
      if (this.month === 1) {
        preMonthDay = this.monthDay[11]
      } else {
        preMonthDay = this.monthDay[this.month - 2]
      }
      console.log("preMonthDay", this.monthDay[11], this.month)

      for (let i = 0; i < preMonthDay; i++) {
        this.previousMonth[i] = i + 1
      }
      if (firstWeek === 0) {
        this.previousMonth = this.previousMonth.slice(-7)
      } else {
        this.previousMonth = this.previousMonth.slice(-firstWeek)
        console.log(33, this.previousMonth)
      }

      // 渲染下個月, 最后一行
      const endDate = new Date(
        this.year,
        this.month - 1,
        this.monthDay[this.month - 1]
      )
      const endWeek = endDate.getDay()
      let nextMonthDay = null
      if (this.month === 12) {
        nextMonthDay = this.monthDay[0]
      } else {
        nextMonthDay = this.monthDay[this.month]
      }
      for (let i = 0; i < nextMonthDay; i++) {
        this.nextMonth[i] = i + 1
      }
      if (endWeek === 6) {
        this.nextMonth = this.nextMonth.slice(0, 7)
      } else {
        this.nextMonth = this.nextMonth.slice(0, 6 - endWeek)
      }
    },
  }

2、綁定四個固定的函數(shù)

  • 點(diǎn)擊上一年,下一年,上個月,下個月時,需要計(jì)算跨年的情況
    // 年份的增減
    addYear() {
      this.year++
      this.updateLeapYear()
    },
    reduceYear() {
      this.year--
      this.updateLeapYear()
    },
    // 月份的增減
    addMonth() {
      this.month++
      if (this.month > 12) {
        this.month = 1
        this.addYear()
      }
    },
    reduceMonth() {
      this.month--
      if (this.month < 1) {
        this.month = 12
        this.reduceYear()
      }
    },

3、點(diǎn)擊具體日期時,確定狀態(tài)

  • 使用數(shù)組存起當(dāng)前已選的日期,使用一個變量記錄當(dāng)前半選的日期
  • 通過一個函數(shù)isActive給每個日期綁定類名,從而在視圖上顯示出來,同時可以確定狀態(tài)的切換
    • 如果點(diǎn)擊了已選日期的數(shù)據(jù),需要剔除,改為空白狀態(tài)
    • 如果點(diǎn)擊了半選態(tài)日期,則直接選中當(dāng)前日期,變?yōu)橐堰x日期
    • 如果點(diǎn)擊了空白狀態(tài)日期,則可能有兩種情況,一是已存在半選態(tài)日期,等待閉合,而是不存在半選態(tài)日期,當(dāng)前設(shè)置為半選
methods: {
    // 突出顯示當(dāng)前日期
    isActive(index) {
      const date = new Date()
      const y = date.getFullYear()
      const m = date.getMonth() + 1
      const d = date.getDate()
      const obj = {}

      if (this.year === y && this.month === m && index === d) {
        obj.today = true
      }
      const newIndexStr = index < 10 ? `0${index}` : `${index}`
      const newMonthStr = this.month < 10 ? `0${this.month}` : `${this.month}`
      const item = `${this.year}/${newMonthStr}/${newIndexStr}`
      if (item === this.partialSelect) {
        obj.active = true
      }
      if (this.selctDate.includes(item)) {
        obj.activeRange = true
      }
      return obj
    },
    selectDay(e, type) {
      const iText = e.target.innerText
      const sDate = Number(iText) < 10 ? `0${iText}` : `${iText}`
      if (type === "previousMonth") {
        if (this.month === 1) {
          this.month = 12
          this.reduceYear()
        } else {
          this.month = this.month - 1
        }
      } else if (type === "nextMonth") {
        if (this.month === 12) {
          this.month = 1
          this.addYear()
        } else {
          this.month = this.month + 1
        }
      }

      let arr = this.selctDate.map((i) => new Date(i).getTime())
      const newMonthStr = this.month < 10 ? `0${this.month}` : `${this.month}`
      const curSelectTime = `${this.year}/${newMonthStr}/${sDate}`
      const curSelectTimeStamp = new Date(curSelectTime).getTime()
      const clsName = e.target.className // 通過類名判斷當(dāng)前是什么狀態(tài)
      if (clsName.includes("activeRange")) {
        // 點(diǎn)擊了范圍內(nèi)的數(shù)據(jù),需要剔除
        arr = arr.filter((i) => i !== curSelectTimeStamp)
      } else if (clsName.includes("active") && !clsName.includes("activeRange")) {
        // 點(diǎn)擊了一個半選狀態(tài)的日期,準(zhǔn)備擴(kuò)展范圍或者單選一個
        if (this.selctDate.length) {
          const itemTime = arr[0]
          const itemTime2 = arr[arr.length - 1]
          const selectTime = curSelectTimeStamp
          if (selectTime < itemTime) {
            console.log("點(diǎn)擊了范圍之前的時間")
          } else if (selectTime > itemTime2) {
            console.log("點(diǎn)擊了范圍之后的時間")
          } else {
            console.log("點(diǎn)擊了范圍內(nèi)的空白,直接加上一個")
          }
          arr = [...arr, curSelectTimeStamp]
          console.log(arr)
        } else {
          // 第一次選擇日期,而且雙擊了,直接單獨(dú)確定這個
          arr = [curSelectTimeStamp]
        }
        // 此時選擇完日前了,半選的日期消費(fèi)掉了,清空
        this.partialSelect = null
      } else {
        console.log("不是半選情況")

        // 即沒有點(diǎn)擊范圍內(nèi),又不是半選狀態(tài),可能是已經(jīng)存在一個半選,等待這個日期來閉合范圍,也可能是第一次打開點(diǎn)擊
        if (this.partialSelect) {
          // 需要和已存在的半選態(tài)日期閉合
          const itemTime = new Date(this.partialSelect).getTime()
          const itemTime2 = curSelectTimeStamp
          const timeArr = [itemTime, itemTime2].sort((a, b) => a - b) // 排序,因?yàn)椴恢勒l在前面
          for (let i = timeArr[0]; i <= timeArr[1]; i += 86400000) {
            arr.push(i)
          }
          // 此時確定好范圍了,半選的日期消費(fèi)掉了,清空
          this.partialSelect = null
        } else if (this.selctDate.length) {
          // 存在一個范圍,同時點(diǎn)擊范圍外,此時設(shè)置半選
          this.day = sDate
          this.partialSelect = curSelectTime
        } else {
          // 不存在一個范圍,所以是第一次點(diǎn)擊
          this.day = sDate
          this.partialSelect = curSelectTime
        }
      }
      let filterArr = Array.from(new Set(arr))
      filterArr = filterArr.sort((a, b) => a - b)
      this.selctDate = filterArr.map((i) => this.formatTime(new Date(i)))
      this.$emit("input", this.selctDate)
      this.$emit("change", this.selctDate)
      this.day = parseInt(sDate)
    },
}

本文轉(zhuǎn)載于:

https://juejin.cn/post/7240088790423863353

如果對您有所幫助,歡迎您點(diǎn)個關(guān)注,我會定時更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器文章來源地址http://www.zghlxwxcb.cn/news/detail-486472.html

到了這里,關(guān)于記錄--設(shè)計(jì)一個可選擇不連續(xù)的時間范圍的日期選擇器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • iview時間控件 動態(tài)不可選日期 可選擇24小時范圍內(nèi) 時間往后退24小時

    iview時間控件 動態(tài)不可選日期 可選擇24小時范圍內(nèi) 時間往后退24小時

    起始時間 觸發(fā) on-change 方法 結(jié)束時間 options 動態(tài)設(shè)置不可選擇的日期。 disabledDate(date) 內(nèi)部的 date 是時間戳的形式 , return 返回的是不想要選的區(qū)間范圍 注意: toLocaleDateString 獲取的是年月日 toLocaleString 獲取年月日時分秒 toLocaleTimeString 獲取時分秒 new Date(new Date().toLocaleStri

    2024年02月11日
    瀏覽(17)
  • element ui的日期選擇器動態(tài)設(shè)定年份,并默認(rèn)顯示在該年份范圍的日期時間

    element ui的日期選擇器動態(tài)設(shè)定年份,并默認(rèn)顯示在該年份范圍的日期時間

    選中某個年份,讓日期選擇器只能選擇該年份內(nèi)的時間,并且默認(rèn)顯示該年份的時間(由于日期選擇器默認(rèn)顯示為當(dāng)前時間,所以需要跳轉(zhuǎn)到選擇的年份) 例:年份選擇了2022年,那么日期選擇也相應(yīng)顯示到2022年,對月日沒有要求,月日默認(rèn)顯示為當(dāng)前日期的月日,只是年份變

    2024年02月13日
    瀏覽(30)
  • element UI DatePicker 日期選擇器 點(diǎn)擊時間點(diǎn)可選限制范圍前后十五天

    設(shè)置:picker-options=\\\"pickerOptions\\\" 然后在data里面設(shè)置 源代碼

    2024年02月06日
    瀏覽(23)
  • 時間范圍選擇時選中日期所使用的當(dāng)日內(nèi)具體時刻 如00:00:00= 23:59:59
  • element ui el-date-picker日期時間選擇器 設(shè)置只能選擇不大于30天時間范圍

    element ui el-date-picker日期時間選擇器 設(shè)置只能選擇不大于30天時間范圍

    需求:要求日期時間選擇器只能選擇最多32天,其他日期為不可點(diǎn)擊狀態(tài)。 日期組件type為daterange或者datetimerange都生效 通過屬性picker-options html data 效果 參考鏈接:https://www.jianshu.com/p/2a07de981fab

    2024年02月04日
    瀏覽(29)
  • datePicker一個或多個日期組件,如何快捷選擇多個日期(時間段)

    elementUI的組件文檔中沒有詳細(xì)說明type=\\\"dates\\\"如何快捷選擇一個時間段的日期,我們可以通過picker-options參數(shù)來設(shè)置快捷選擇: 通過設(shè)置變量pickerOption的值可設(shè)置快捷選擇: 其中dateFormat方法是將日期格式化,getAllDate方法是獲取開始和結(jié)束日期之間的全部日期,在data中定義:

    2024年02月13日
    瀏覽(34)
  • element UI日期選擇器固定選擇范圍

    項(xiàng)目中經(jīng)常會使用到日期選擇器,并且會對可選擇的日期有要求,分享幾個常用的,給大家作參考。 只能選擇當(dāng)前日期前(不包含當(dāng)前日期) ?只能選擇當(dāng)前日期前(包含當(dāng)前日期) 指定日期范圍(例如2022年12月1日至當(dāng)前日期)

    2024年02月07日
    瀏覽(28)
  • antd 日期選擇框增加季度預(yù)設(shè)范圍

    antd 日期選擇框增加季度預(yù)設(shè)范圍

    測試同學(xué)說想要有個季度的預(yù)設(shè)選擇框,方便快速選擇季度的開始和結(jié)束日期。 antd 的rangepicker是支持預(yù)設(shè)的 日期選擇框 DatePicker - Ant Design 實(shí)現(xiàn)方法很簡單,按照官網(wǎng)示例用moment初始化一下即可 獲取當(dāng)前一季度的開始日期時間:?moment().quarter(1).startOf(\\\'quarter\\\') 組件使用: 效果

    2024年01月25日
    瀏覽(14)
  • element-plus的日期選擇器限定選擇范圍

    element-plus的日期選擇器限定選擇范圍

    提示:這里可以添加本文要記錄的大概內(nèi)容: element-plus的日期選擇器限定選擇范圍,由于數(shù)據(jù)的獲取范圍限定,需要前端處理一下日期的選擇范圍 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 提示:這里對文章進(jìn)行總結(jié): 這里只收集我目前為止在項(xiàng)目的過程中遇到的

    2024年02月13日
    瀏覽(16)
  • Element UI DatePicker 日期范圍選擇動態(tài)設(shè)置禁選日期

    Element UI DatePicker 日期范圍選擇動態(tài)設(shè)置禁選日期

    今天在工作時,后端提出了一個DatePicker日期范圍組件的一個問題 用圖描述大概就是選擇開始日期 13 號后,只能選擇 13 號前一周和后一周的日期,其他日期處于禁止選擇狀態(tài)。 先去看了下 element 的相關(guān)文檔,找到了一個 當(dāng)前時間日期選擇器特有的選項(xiàng)picker-options, 傳送門

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包