最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue實(shí)現(xiàn)萬(wàn)年日歷的示例詳解

 更新時(shí)間:2023年01月12日 08:53:48   作者:qb  
又是一個(gè)老生常談的功能,接下來會(huì)從零實(shí)現(xiàn)一個(gè)萬(wàn)年日歷,從布局到邏輯,再到隨處可見的打卡功能。文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下

前言

又是一個(gè)老生常談的功能,接下來會(huì)從零實(shí)現(xiàn)一個(gè)萬(wàn)年日歷,從布局到邏輯,再到隨處可見的打卡功能。涉及的內(nèi)容有:

  • 日歷的布局
  • 日期數(shù)據(jù)的產(chǎn)生
  • 年月的變化
  • 連續(xù)最長(zhǎng)打卡日期
  • 補(bǔ)卡邏輯

1.日歷的布局

<template>
  <div class="calendar">
    <!-- 年份和日期變化 -->
    <div class="select">
      <span class="select-icon select-sub" @click="changeYear(-1)">《</span>
      <span class="select-icon select-sub select-month" @click="changeMonth(-1)"><</span>
      <span>{{ currentMonth }}</span>
      <span class="select-icon select-add select-month" @click="changeMonth(+1)">></span>
      <span class="select-icon select-add" @click="changeYear(+1)">》</span>
    </div>
    <!-- 日歷標(biāo)題 -->
    <ul class="calendar-header">
      <li v-for="(item, index) in headerData" :key="index" class="calendar-header-item">
        <span>{{ item }}</span>
      </li>
    </ul>
    <!-- 日期內(nèi)容 -->
    <div class="calendar-box">
      <div class="calendar-box-item" :class="{ delMark: !hasRemarkDays.includes(item) }" v-for="(item, index) in baseDateList" :key="index">
        <!-- 最高層級(jí)顯示圓形日期 -->
        <div class="item-wrap" :class="{ hasMarked: hasRemarkDays.includes(item) }" @click="toRemark(item, currentDate)">
          <span class="item-date">{{ item ? item : "" }}</span>
          <span class="item-patch" v-if="isShowPatch && !hasRemarkDays.includes(item) && item && item < currentDate">補(bǔ)卡</span>
          <span class="item-current" v-if="currentDate == item"><i></i></span>
          <span class="item-continue" v-if="continueMarkObj.maxDay == item">連續(xù){{ continueMarkObj.maxLen }}天</span>
        </div>
        <!-- 全遮罩背景淡橙色背景 -->
        <span class="all-mark" v-if="hasRemarkDays.includes(item)"></span>
        <!-- 左右遮罩,如果左邊無(wú)打卡,遮住;如果右邊無(wú)打卡,遮住 -->
        <span class="left-mark" v-if="index % 7 === 0 || !hasRemarkDays.includes(item - 1)"></span>
        <span class="right-mark" v-if="index % 7 === 6 || !hasRemarkDays.includes(item + 1)"></span>
      </div>
    </div>
  </div>
</template>

2.日期數(shù)據(jù)的產(chǎn)生

  computed: {
    // 返回當(dāng)前的實(shí)際天數(shù),從周一算起
    baseDateList() {
      let date = new Date(this.currentMonth);
      let monthFlag = date.getMonth() + 1;
      let yearFlag = date.getFullYear();
      let currentData = date.getDay();
      let dayLength = new Date(yearFlag, monthFlag, 0).getDate();

      // 周一之前的補(bǔ)0
      let dateBaseData = [];
      for (let i = 0; i < currentData; i++) {
        dateBaseData.push(0);
      }
      // 周一之后的實(shí)際填寫
      for (let i = 0; i < dayLength; i++) {
        dateBaseData.push(i + 1);
      }

      return dateBaseData;
    },
  }

其中currentData表示今天是周幾,在此之前的數(shù)組都補(bǔ)充為0,dayLength表示這月共多少天,然后,全部push進(jìn)日期數(shù)據(jù)中。通過flex布局中的flex-wrap: wrap;讓其自動(dòng)換行即可。

3.年月的變化

// 修改年:當(dāng)type = +1時(shí),表示加一年,為-1時(shí)反之
changeYear(type) {
  let time = new Date(this.currentMonth);
  let year = time.getFullYear() + type;
  let month = time.getMonth() + 1;
  this.currentMonth = `${year}-${month}`;
},
// 修改月:當(dāng)type = -1時(shí),表示加一月,為-1時(shí)次之
changeMonth(type) {
  let time = new Date(this.currentMonth);
  let year = time.getFullYear();
  let month = time.getMonth() + 1;
  if (month === 12 && type > 0) { // 12月,并且是加的情況,年加1,月變?yōu)?
    year++
    month = 1
  } else if(month === 1 && type < 0) { // 1月,并且是減的情況,年減1,月變?yōu)?2
    year--
    month = 12
  } else { // 其他情況,直接變化變量type的大小
    month += type
  }
  this.currentMonth = `${year}-${month}`;
},

引入type,既是加減的標(biāo)志位,又是變量的大小。

4.連續(xù)最長(zhǎng)打卡日期

getMaxDay() {
  let arr = this.hasRemarkDays;
  let buffChild = [];
  let max = [];
  
  for (let i = 0; i < arr.length; i++) {
    // 如果子集不連續(xù)了,重新進(jìn)行賦值和更新
    if (buffChild.length && arr[i] - buffChild[buffChild.length - 1] > 1) {
      max = max.length > buffChild.length ? [...max] : [...buffChild];
      buffChild = [];
      buffChild.push(arr[i]);
      continue;
    }
    // 如果不是,直接進(jìn)行累計(jì)
    buffChild.push(arr[i]);
  }
  return max.length > buffChild.length ? [...max] : [...buffChild];
},

假設(shè)max是最大的數(shù)組,那么,每次找到連續(xù)的數(shù)組都max進(jìn)行對(duì)比并更新。在節(jié)點(diǎn)中,通過:class="{ hasMarked: hasRemarkDays.includes(item) }"的方式,為其添加hasMarked的樣式。

5.補(bǔ)卡日期

補(bǔ)卡邏輯很簡(jiǎn)單,當(dāng)前日期之前的日期,均可進(jìn)行補(bǔ)卡,然后,在觸發(fā)的方法中,通過$emit的方式向父組件傳遞需要補(bǔ)卡的日期,并觸發(fā)補(bǔ)卡邏輯。

總結(jié):日歷的實(shí)現(xiàn)主要是應(yīng)用JavaScript中Date對(duì)象的api和經(jīng)典的flex布局,而最長(zhǎng)連續(xù)打卡是常規(guī)算法最長(zhǎng)連續(xù)子序列的實(shí)現(xiàn)方式之一。

到此這篇關(guān)于Vue實(shí)現(xiàn)萬(wàn)年日歷的示例詳解的文章就介紹到這了,更多相關(guān)Vue萬(wàn)年日歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue循環(huán)中多個(gè)input綁定指定v-model實(shí)例

    Vue循環(huán)中多個(gè)input綁定指定v-model實(shí)例

    這篇文章主要介紹了Vue循環(huán)中多個(gè)input綁定指定v-model實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 超簡(jiǎn)單的Vue.js環(huán)境搭建教程

    超簡(jiǎn)單的Vue.js環(huán)境搭建教程

    這篇文章主要為大家分享了一份超簡(jiǎn)單的Vue.js環(huán)境搭建教程,幫助大家快速搭建vue環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Vue路由切換的兩種方式示例詳解

    Vue路由切換的兩種方式示例詳解

    這篇文章主要介紹了Vue路由切換的兩種方式,主要包括標(biāo)簽切換和js切換,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 解決vue中虛擬dom,無(wú)法實(shí)時(shí)更新的問題

    解決vue中虛擬dom,無(wú)法實(shí)時(shí)更新的問題

    今天小編就為大家分享一篇解決vue中虛擬dom,無(wú)法實(shí)時(shí)更新的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vuex入門最詳細(xì)整理

    vuex入門最詳細(xì)整理

    在本篇文章里小編給大家分享的是關(guān)于vuex入門最詳細(xì)整理的相關(guān)內(nèi)容,需要的朋友們參考下。
    2020-03-03
  • element滾動(dòng)條組件el-scrollbar的使用詳解

    element滾動(dòng)條組件el-scrollbar的使用詳解

    本文主要介紹了element滾動(dòng)條組件el-scrollbar的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • vue項(xiàng)目打包之開發(fā)環(huán)境和部署環(huán)境的實(shí)現(xiàn)

    vue項(xiàng)目打包之開發(fā)環(huán)境和部署環(huán)境的實(shí)現(xiàn)

    這篇文章主要介紹了vue項(xiàng)目打包之開發(fā)環(huán)境和部署環(huán)境的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Vue如何實(shí)現(xiàn)u-form多個(gè)form表單同時(shí)校驗(yàn)

    Vue如何實(shí)現(xiàn)u-form多個(gè)form表單同時(shí)校驗(yàn)

    在 Vue 項(xiàng)目中使用 UView UI 的 u-form 組件時(shí),多個(gè)表單同時(shí)校驗(yàn)的需求非常常見,本文主要介紹了如何使用 u-form 組件實(shí)現(xiàn)多個(gè)表單同時(shí)校驗(yàn),需要的可以參考一下
    2025-01-01
  • vue實(shí)現(xiàn)列表的添加點(diǎn)擊

    vue實(shí)現(xiàn)列表的添加點(diǎn)擊

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)列表的添加點(diǎn)擊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Vue中xlsx的使用方法指南

    Vue中xlsx的使用方法指南

    這篇文章主要給大家介紹了關(guān)于Vue中xlsx的使用方法指南,有很多辦法都可以實(shí)現(xiàn),其中最簡(jiǎn)單的還是使用插件xlsx,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

嵊泗县| 潼关县| 苗栗市| 萍乡市| 巴青县| 中阳县| 诸城市| 禹州市| 会理县| 天峨县| 洛阳市| 天长市| 中江县| 湖南省| 永春县| 突泉县| 清河县| 白河县| 饶平县| 金坛市| 台东市| 临桂县| 隆林| 西吉县| 荔浦县| 武山县| 潮州市| 固镇县| 尉犁县| 平山县| 耒阳市| 东兴市| 邻水| 山阴县| 金堂县| 梅河口市| 广水市| 密云县| 化州市| 乌拉特前旗| 托克托县|