Tag: 个性化日历预览模式: 普通 | 列表

用moment.js构造带操作区的VUE个性化日历

 

这次项目需要用到这样一个稍有点特别的日历,每一天有一个“操作区”(根据数据有不同的操作),因为这个形态有点特殊,所以无法直接使用vant的日历 组件。之前这个日历列表是由后端同事提供的。后来我自己对moment.js 的操作比较熟练了,自己构造了一个,主要代码如下。

Javascript代码
  1. initCale(){  
  2.     const NOW = moment('2021-05-16')  
  3.     let _first = _.cloneDeep(NOW).startOf('month')  //月头  
  4.     let _last = _.cloneDeep(NOW).endOf('month')     //月尾  
  5.   
  6.     // 计算本月数据  
  7.     let days = NOW.daysInMonth()    //本月天数  
  8.     let list = []   //最终日期列表,存入这个数组  
  9.     for (let ii = 0; ii < days; ii++) {  
  10.         let dd = _.cloneDeep(_first).add(ii, 'days')    //从月头开始往后推算整月  
  11.         list.push(  
  12.             {  
  13.                 date:dd.format('YYYY-MM-DD'),  
  14.                 sd:dd.format('DD'),  
  15.                 day:dd.day(),       //星期几  
  16.                 used:true,  
  17.                 today:dd.format('YYYY-MM-DD')==NOW.format('YYYY-MM-DD'//今天  
  18.             }  
  19.         )  
  20.     }  
  21.   
  22.     // 补月头(上个月剩下的几天)  
  23.     let lenHead = _first.day()-1    //本月第一天是星期几?从而推算月头天数  
  24.     for (let ii = 1; ii <= lenHead; ii++) {  
  25.         let dddd = _.cloneDeep(_first).add(-ii, 'days')  
  26.         list.unshift(  
  27.             {  
  28.                 date:dddd.format('YYYY-MM-DD'),  
  29.                 sd:dddd.format('DD'),  
  30.                 day:dddd.day(),  
  31.                 used:false  
  32.             }  
  33.         )  
  34.     }  
  35.       
  36.     // 补月尾  
  37.     let lenTail = 7 - _last.day()   //月尾天数  
  38.     for (let ii = 1; ii <= lenTail; ii++) {  
  39.         let dddd = _.cloneDeep(_last).add(ii, 'days')  
  40.         list.push(  
  41.             {  
  42.                 date:dddd.format('YYYY-MM-DD'),  
  43.                 sd:dddd.format('DD'),  
  44.                 day:dddd.day(),  
  45.                 used:false  
  46.             }  
  47.         )  
  48.     }  
  49.     this.caleList = list  //caleList是VUE中用于渲染出日历的变量  
  50. },  
  51. 主要HTML:  
  52.   
  53. <ul class="caleList">  
  54.     <li class="top">一</li>  
  55.     <li class="top">二</li>  
  56.     <li class="top">三</li>  
  57.     <li class="top">四</li>  
  58.     <li class="top">五</li>  
  59.     <li class="top">六</li>  
  60.     <li class="top">日</li>  
  61.     <li v-for="item in caleList" :key="item.date"  
  62.         :class="[{'used':item.used},{'today':item.today}]"  
  63.     >  
  64.         <div class="date">{{item.sd}}</div>  
  65.         <div class="opt" v-if="item.used">操作</div>  
  66.     </li>  
  67. </ul>  
  68. 主要CSS(LESS):  
  69.   
  70. .caleList{  
  71.     display: flex; flex-wrap: wrap;  
  72.     li{  
  73.         flex:1 0 100%/7;  
  74.         border: 1px #fff solid;  
  75.           
  76.           
  77.         background-color: #aaa;  
  78.         color: #777;  
  79.           
  80.         &.top{  
  81.             background-color: #fff; color: #900;  
  82.             border: none;  
  83.             height: 40px; display: flex; align-items: center; justify-content: center;  
  84.         }  
  85.         &.used{  
  86.             background-color: #eee;  
  87.             color: #333;  
  88.         }  
  89.         &.today{  
  90.             background-color: rgb(163, 10, 31); color: #fff;  
  91.         }  
  92.         .date{  
  93.             font-size: 24px;  
  94.             display: flex; align-items: center; justify-content: center;height: 35px;  
  95.         }  
  96.         .opt{  
  97.             font-size: 12px;  
  98.             padding: 0px 15px 10px; text-align: center;  
  99.             color: rgb(112, 11, 11);  
  100.             line-height: 120%;  
  101.         }  
  102.     }  
  103. }  

因为逻辑比较简单,此处并没有抽象成组件,有需要再说。

特别感谢知友的这篇文章:

 

Sail:moment的高频用法总结

Tags: vue 个性化日历

分类:我们的作品 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 269