vue - 小日历项目制作中的问题与解决思路

效果图:

项目难点:
1. 每个月的日期数是不定的,拢共需要几个格子?
按照教程的做法需要42个。所以遍历数字42,得到42个div做格子。

2. 格子的排版怎么做?
顶部的星期布局使用的flex水平方向两边对齐并单项flex为1占满空间。
下边格子用了grid布局(具体见源码css)

3. 本月一号是星期几怎么计算?
可以利用Date对象提供的公式计算:
new Date(目标年份,目标月份 - 1,1).getDay();

4. 本月最大天数是几怎么计算?
可以利用口诀计算:...
也可以利用Date对象提供的公式计算:
new Date(目标年份,目标月份,0).getDate();

5. 本月一号从哪里开始渲染?
因为所有格子是从1-42遍历的。

我们又得到了本月一号是星期几,所以我们做一个判断,当前格子的编号dayId是从1-42的。

判断dayId大于beginDay(每月1号是星期几,0表示星期日,是第一个格子,6表示星期6是第7个格子。)就说明是本月开始日了,

用公式if(dayId > beginDay)那么渲染编号就不是dayId,而是dayId - beginDay。7-6就是1,8-6就是2,依次类推就有了1-31的日子。

这里判断当前格子编号大于开始日、并且当前格子 - 开始日后,遍历的数字不能超过本月最大数字。满足这俩条件的就是本月日历数据。

6. 本月一号之前的几天怎么处理?(上个月那几天灰色的怎么计算、展示出来?)
有两种计算方法,但是道理都是一个,当前格子的dayId是从1->beginDay的。而beginDay就是6以内的一个正数。

规律就是beginDay - dayId,依次就是7、6、5、4、3、2、1,dayId - beginDay就是-6、-5、-4、-3、-2、-1、0这样。

而我们又知道beginDay的前一天,也就是1号的前一天、上个月的最后一天的数字(比如31),31-正数 || 31 + 负数就都能求出来。

7. 从本月一号渲染到最大天数后、后边怎么计算?(下个月那几天灰色的怎么计算、展示出来?)
原理同上了,也是要判断当前编号,如果当前编号dayId成了32,那就是大于本月最大天数(比如说31)了,那就从1开始计算。

难点是这个1编号乃至接下来的顺序编号怎么出。那就是当前dayId - 最大天数31 - 开始天数beginDay。

你想想,beginDay是6,占了前6个格子,最大天数是31,又占了31个格子。这加起来就是37格。

当dayId编号是38的时候,38-37=1,下一个dayId是39,于是39-37=2,以此类推,就有了下个月的几天。

以上三天,通过if判断展示出了对应的三种span情况。
8. 上个月&&下个月置灰的效果怎么做?
我们计算知道第一个span和第三个span都分别是上月和下月的日子,加上灰度类名即可。

9. 切换左右按钮月份怎么处理?切换到今天跳转到当前日期

其实三个按钮的原理一样,都是切换按钮,跳转指定的年月(日是当前选中的,10-11问)。
就是要重置以下这几个参数:

而这几个参数初始化的时候处理过一遍,所以这里封装一下:

目的是渲染左上角这个日期。

并初始化数据this.nowYear等。
初始化的时候调用一下init、回到今天功能也是调用一下init,传入当前日期即可。

上一个月和下一个月,分别传入this.nowMonth --/++ 的数据,当然要做month的极值判断

10. 点击每一天切换类名并添加边框样式,此时调用函数传参应该是啥?
我的初步理解,应该还是当前dayId。然后我们渲染的时候,判断dayId和当前点击变量重合就加一个类名表示选中样式。

:class="[(dayId - beginDay == nowDay && ‘today‘),(dayId == dayIndex && ‘active‘)]"

today的判断逻辑是:判断当前实际渲染的日子(格子id"dayId" - 开始盒子编号“beginDay”) === 今天日期

active选中的判断逻辑是:判断当前格子编号"dayId" === 点击div时重置的daiIndex的编号。

这里这么做有两个问题:
1、today判断的只有日期,第几号,没有判断那一年那一月,我换个上个月的本日,today依旧生效
2、点击上个月或下个月的灰色区域,会重新渲染表格,到时候保存的dayId和重新渲染后的dayId格子内的数字一定不一致,
因此修改如下:
首先today必须是"2019/06/06"这个字段完全一致才能视做今天。
因此利用new Date().toLocaleDateString()得到一个完整的日期字符串2019/5/28。然后每个div上也渲染上data-str属性,通过计算得到当前格子所代表的时间"年/月/日"相同的串,
:data-str="getStr(三个span的哪一个,当前月份, 当前格子的日期)"
因为三类span分别代表上月、本月、下月。所以也有可能会跨年,所以传入第一个参数用于做判断第二个参数的极值是12还是1。
getStr内部逻辑如下:

最后判断第一个问题:只有两个串完全相等才是today。

这样一来第二个问题:切换,也就好改了,拿着e.data.target.dataset时间串去init(传参即可)

span @click="changeActive"
点击的时候,去执行修改日期即可

11. 点击下(上)个月那几天灰色的切换到下(上)个月怎么处理?
同上一条差不多

12. 当前选中本月31号,切换到上月没有31号怎么展示?
再次修改当前active的逻辑,修改变量名为dayActive。
类名绑定逻辑为:

初始话的时候,dayActive==当前日期

切换日期的时候,正则匹配到data-str绑定到span格子上的data属性值的日期:

切换月份按钮的时候,检查切换前选中的是哪一天,然后判断要切换的月份没有这一天,(主要是31号的判断,其他1-28号都会有)就选中为最大天。
this.maxDayNum是计算属性很讨巧。

源码地址:github

原文地址:https://www.cnblogs.com/padding1015/p/11032457.html

时间: 2024-10-12 07:33:32

vue - 小日历项目制作中的问题与解决思路的相关文章

微信小程序web-view不支持打开非业务域名解决思路

问题起因: 我这的微信小程序小程序需要跳转到一个第三方的网站,然后就用web-view插件进行页面跳转,就会提示我出现非业务域名无法打开. 解决思路: 1.(不成功,安卓手机可以通过,iOS通过不了)通过微信公众平台的小程序开发文档发现在 设置-开发设置-业务域名中来设置业务域名,在这里我用的是自己域名和服务器(通过SSL证书的绑定)搭了一个静态网址作为平台进行跳转到第三方链接. 2.(成功)不去链接第三方网址,自己写了一个需求简易网站发布(域名需要绑定SSL证书) 注意:在这里我用的是Ngin

项目实践中Linux集群的总结和思考

前言:作为一名Linux/unix系统工程师.项目实施工程师,这几年一直在涉及到对外项目,经手过许多小中型网站的架构,F5.LVS及Nginx接触的都比较多,我想一种比较通俗易懂的语气跟大家说明下何谓负载均衡,何谓Linux集群,帮助大家走出这个误区,真正意义上来理解它们,具体项目施工案例请参考我在network.51cto.com上的同类文章.一.目前网站架构一般分成负载均衡层.web层和数据库层,我其实一般还会多加一层,即文件服务器层,因为现在随着网站的PV越来越多,文件服务器的压力也越来越

Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项目地址:https://github.com/jrainlau/draw-something 下载 & 运行 git clone [email protected]:jrainlau/draw-something.git cd draw-something && npm install

使用vue cli开发项目中遇到的坑

一.部署文件 使用vue cli 开发项目,执行npm run build命令生成dist静态文件,将dist文件包放到服务器中即可. 刚接触webpack,不知道怎么部署前端文件,原以为需要将app文件上传,在 inux上安装node,以及npm install 一系列的包,捣鼓了很久,发现只需要执行 npm run build 将源码打包成一个静态文        文件即可,上传静态文件dist,将 controller指向index.html. 二.跨域问题 实行前后端分离,使用vue i

一个基于ES6+webpack的vue小demo

上一篇文章<一个基于ES5的vue小demo>我们讲了如何用ES5,vue-router做一个小demo,接下来我们来把它变成基于ES6+webpack的demo. 一.环境搭建及代码转换 我们先搭建一下vue 的开发环境,根据我的一篇随笔<Vue开发环境搭建及热更新>,我们一步步搭建开发环境,project名为ES6-demo. 在之前我发表的一篇随笔< 理解最基本的Vue项目>中,说到了在放置组件和入口文件的src文件夹中,main.js文件就是入口文件,App.v

微信小程序免费制作一键生成平台是什么原理?速成应用代理需要多少钱

微信10亿活跃用户,10亿的流量等待瓜分.想想现在人们用哪个应用最多?当然是微信,而微信小程序就是依托微信而存在的,先天优势就在那里,怎么可能不火?作为想要创业以及苦于一直没有机会发现好商机的你,为什么要错过速成应用微信小程序加盟代理这个项目? 小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不用关心是否安装太多应用的问题.应用将无处不在,随时可用,但又无需安装卸载.全面开放

教你一个vue小技巧,一般人我不说的

本文由云+社区发表 1. 需求 最近的项目中,需要实现在vue框架中动态渲染带提示框的单选/多选文本框,具体的效果如下图所示,在输入框聚焦时,前端组件通过接收的kv参数渲染出选项,用户点击选项,可以将选择的选项的key拼装到输入框中,同时允许用户自由输入. 由于项目中使用的element-ui,首选考虑使用组件的input和select组件,然而实际使用中发现框架提供的组件不能很好满足此需求.例如,使用带输入建议的input组件,能够实现提示框和单选,但并不能方便地实现多选(重复选择会覆盖输入框

Vue + Spring Boot 项目实战(一):项目简介 &#619178;

原文: http://blog.gqylpy.com/gqy/489 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

vue小案例--简易评论区

一.小案例(评论区) 1.流程 (1)分析静态页面.(vue项目创建参考https://www.cnblogs.com/l-y-h/p/11241503.html)(2)拆分静态页面,变成一个个组件.(3)对组件编码,生成动态页面. 2.静态页面 参考来源:https://www.bilibili.com/video/av49099807/?p=22&t=1223 [举例:] <!DOCTYPE html> <html> <head> <meta char