vue仿写日历面板

梦里梦外; 2023-02-15 03:39 21阅读 0赞

之前写过一篇js写日历面板的博文,是用table渲染的,现在用vue写,效果如下:
在这里插入图片描述

思路

  1. 1,第一行星期几的表头是固定的
  2. 2,判断要查询的月份渲染是5行还是6行,也就是35格还是42
  3. 3,获取要查询的月份的1号是星期几,小于这个星期几前面的格子渲染空格
  4. 4,渲染从1号开始的后面的格子,最后一行的空格判断日期大于要查询的月份天数则渲染空格

解决

所有地方的注释都写了:

  1. // 查询
  2. <el-form-item label="选择日期:" prop="">
  3. <el-date-picker
  4. v-model="" // 这里自己获取当前日期就好了
  5. type="month"
  6. placeholder="选择日期"
  7. :editable="false"
  8. :clearable="false"
  9. @change="changeDate"
  10. >
  11. </el-date-picker>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-button type="warning" @click.native="onSearch" icon="el-icon-search" round>查询</el-button>
  15. </el-form-item>
  16. // 日历面板
  17. <div class="clander">
  18. <div id="contHead">
  19. <div class="title"> // 抬头年月
  20. {
  21. {myyear}}年{
  22. {++mymouth}}月
  23. </div>
  24. <div class="week"> // 星期几
  25. <p v-for="item in weekday" :key="item">
  26. {
  27. {item}}
  28. </p>
  29. </div>
  30. </div>
  31. <div id="contBox">
  32. <div v-for="ite in mArr" :key="(ite+1)*Math.random()"> </div> // 1号之前的空格
  33. <template v-for="item in contArr">
  34. <div v-if="item > monthdays[mymouth]" :key="(item+2)*Math.random()"> </div> // 最后一行后面的空格(日期大于当月的天数则为空)
  35. <div v-else @click="changeDay(item)" class="dayBox" :key="(item+1)*2"> // 渲染日期,放进数值
  36. <span class="day">{
  37. {item}}</span> // 日期数字
  38. <span class="sum">{
  39. {allQuti[item-1]}}</span> <!-- 当天数值, 这里-1因为数组里面日期是从1号开始的,值是从第0位开始 -->
  40. </div>
  41. </template>
  42. </div>
  43. <div class="contFoot">
  44. 合计:月累计用水 0
  45. </div>
  46. </div>
  47. weekday: new Array("星期天","星期一","星期二","星期三","星期四","星期五","星期六"),
  48. monthdays: new Array(31,28,31,30,31,30,31,31,30,31,30,31), // 一月到12月的天数
  49. mydate : new Date(), // 要查询的日期,这里我用的是element的type='month'的日期组件,它接收这样的格式
  50. m: '', // 当月1号星期几
  51. mArr: [], // 1号之前的格子
  52. contArr: [], // 1号以后及1号的格子
  53. computed: {
  54. myyear() { // 获取年
  55. return this.mydate.getFullYear()
  56. },
  57. mymouth: { // 获取月 这里要使用set是因为逻辑中对这个变量进行计算了,否则控制台会报错
  58. get: function () { return this.mydate.getMonth() } ,
  59. set: function (val) { }
  60. }
  61. },
  62. mounted () {
  63. // 初始化执行一次,获取本月日历面板
  64. this.sumClander()
  65. },
  66. methods: {
  67. // 日历计算逻辑
  68. sumClander () {
  69. this.mArr = []
  70. this.contArr = []
  71. this.mydate.setDate(1); // 将要查询的月份设为1号
  72. this.m = this.mydate.getDay() // 获取要查询的月的1号是星期几
  73. for (var d = 0; d < this.m; d++) { // 渲染1号之前的空格
  74. this.mArr.push(d)
  75. }
  76. let cont = ''
  77. this.m >= 5 && this.monthdays[this.mymouth] > 30 ? cont = 42 : cont = 35 // 判断日历是五行(35格子)还是六行(42格子)(判断1号是否大于等于礼拜五并且当月天数是否大于30天)
  78. for (var s = 1; s < cont - this.m + 1; s++) { // 从1号开始后面的格子,渲染日期
  79. this.contArr.push(s)
  80. }
  81. if(this.myyear%4 == 0 && this.myyear%100 != 0 || this.myyear%400 == 0){ //判断闰年2月=29天
  82. this.monthdays[1] = 29;
  83. }
  84. },
  85. // 日期组件change
  86. changeDate(value) {
  87. function checkTime(i){ // 时间补零
  88. if(i<10){
  89. i = '0'+i
  90. }
  91. return i
  92. }
  93. var date;
  94. date = new Date(value)
  95. this.yearTime = date.getFullYear()
  96. this.monthTime = checkTime(date.getMonth()+1)
  97. var changDate = this.yearTime + '-' + this.monthTime // 将change后的日期转变为例:2020-06 这种格式
  98. this.mydate = new Date(changDate) // 将change后的日期赋值给日历的数据源this.mydate
  99. },
  100. // 点击查询
  101. onSearch () {
  102. this.sumClander()
  103. },
  104. }

就酱实现逻辑,代码还没来得及优化,有些地方写的有些粗糙,只是思路清晰就好了,可以自己调试优化,查询一个月试试:
在这里插入图片描述

完美

发表评论

表情:
评论列表 (有 0 条评论,21人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js仿日历

    项目需求,页面展示当前月的日历,每天的框里面放上用电量,可以按月查询,日历展示如下: ![在这里插入图片描述][20200514171354586.png] ![在这里插

    相关 UI仿

    [Android 仿京东、天猫 app 的商品详情页的布局架构, 以及功能实现][Android _ app _] 仿京东、天猫 app 的商品详情页 [