背景:朋友想让我帮他写一个前端的日历demo,昨天晚上抽空搞了一下,产出了一个Demo。由于是简单demo,所以对样式上没有过多的调整。

思路:

获取每个月的第一天是周几,按照周几插入数据。上个月的在1号前面置空,下个月在月最后一天后面从1开始插入
抽调函数,渲染传参,下个月和上个月切换功能也只要切换参数就可以。
切换上个月或者下个月,只要把对应的年份、月份、日子传到下方渲染的公用方法里即可。

注意点:

这个其实本身是一个很简单的功能,在开发的时候只要细心点,关注一下month,因为在loadCalender方法中,将每个月的日子放入数组里面,数组是从0开始的,月份则是从1 。然后在传数据的时候要求month是从1开始的,所以只要细心关注一下这里,就没有什么问题了。

效果图:

代码:

DOM结构<div class="calendar"><!--上下月箭头切换+日历头--><div class="calendar__header"><span @click="handlePreMonth"><</span><span>{{year}}年{{month}}月{{day}}日</span><span @click="handleNextMonth">></span></div><!--整个日历区域--><div class="calendar__main"><!--周一-周日展示--><div class="main__block-head"><span class="head-span" v-for="(item, index) in blockHead" :key="index">{{item}}</span></div><!--月份日期展示--><div class="main__block"><span class="head-span" v-for="(item, index) in totalCalenderList" :key="index" @click="handleDayClick(item)"><span>{{item.content}}</span><span class="span-status" v-html="spanStatus(item)"></span></span></div></div></div>```data数据:```php
data() {return {year: new Date().getFullYear(),month: new Date().getMonth()+1,day: new Date().getDate(),blockHead: ['日','一','二','三','四','五','六'],totalCalenderList: [],selectedYear: new Date().getFullYear(),selectedMonth: new Date().getMonth(),selectedDate: new Date().getDate(),statusTrue : [// 存放成功数据{month: 3,day: 8},{month: 3,day: 1}],statusFalse: [// 存放失败数据{month: 3,day: 7},{month: 3,day: 2}]};},created() {this.loadCalender(this.year, this.month, this.day);},methods: {loadCalender(year, month, day) {var that = this;// 定义每个月的天数,如果是闰年第二月改为29天// 每个月对应的天数let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {// 闰年+1天daysInMonth[1] = 29;}// 获得第一天是星期几let targetDay = new Date(year+'-'+month+'-01').getDay();// 将要在calendar__main整个日期中渲染的列表let total_calender_list = [];let perNum = targetDay;// 填充前方空位if (targetDay > 0){for (let i=0; i < perNum; i++){let obj = {type: 'pre',content: "",month: month-1}total_calender_list.push(obj)}}// 填充日期正文数字for (let i=0; i<daysInMonth[month-1]; i++){let obj = {type: 'normal',content: i+1,month: month,};total_calender_list.push(obj)}let nextNum = 0;if(total_calender_list.length > 35) {// 1行7位,超过5行了nextNum = 42 - total_calender_list.length;} else {nextNum = 35 - total_calender_list.length;}for (let i = 0; i<nextNum; i++) {let obj = {type: 'next',content: i+1,month: month+1}total_calender_list.push(obj)}this.totalCalenderList = total_calender_list;console.log("列表", this.totalCalenderList, month)},handlePreMonth() {// 点击切换上个月的日历   if (this.selectedMonth === 0) {this.selectedYear = this.selectedYear - 1this.selectedMonth = 11this.selectedDate = 1} else {this.selectedMonth = this.selectedMonth - 1this.selectedDate = 1}this.loadCalender(this.selectedYear, this.selectedMonth+1, this.selectedDate)console.log("selectedMonth",this.selectedMonth+1)},handleNextMonth() {// 点击切换下个月的日历if (this.selectedMonth === 11) {this.selectedYear = this.selectedYear + 1this.selectedMonth = 0;this.month = 0;this.selectedDate = 1} else {this.selectedMonth = this.selectedMonth + 1;this.month = this.selectedMonth + 1;this.selectedDate = 1}this.loadCalender(this.selectedYear, this.selectedMonth+1, this.selectedDate)console.log("selectedMonth",this.selectedMonth+1)},spanStatus(item) {// 将状态的数据进行对比,并返回出内容let text = '';for(let i=0; i< this.statusTrue.length ; i++) {if(this.statusTrue[i].month === item.month && this.statusTrue[i].day === item.content){console.log("new", this.statusTrue[i].month,this.statusTrue[i].day, "false", item.month, item.content)text = '成功状态';}}for(let i=0; i< this.statusFalse.length ; i++) {if(this.statusFalse[i].month === item.month && this.statusFalse[i].day === item.content){text = '失败状态';}}return text;},}

css 「只是做了个demo,所以没有写太多样式」

.the-landing {.calendar {width: 700px;margin: 0 auto;box-shadow: 0px 7px 6px 0px rgba(194, 116, 3, 0.14),inset 0px 1px 0px 0px rgba(255, 190, 70, 0.14);.calendar__header {// 日历头text-align: center;line-height: 70px;font-size: 28px;display: flex;justify-content: space-around;}.calendar__main {.main__block-head {width: 700px;display: flex;justify-content: space-around;.head-span {width: 96px;height: 70px;text-align: center;line-height: 70px;}}.main__block {width: 700px;display: flex;justify-content: space-around;flex-wrap: wrap;.head-span {display: flex;flex-direction: column;justify-content: center;>span {width: 96px;height: 70px;line-height: 70px;display: inline-block;text-align: center;}.span-status {font-size: 20px;}}}}}
}

好的,这个简单的demo就放完了,因为写在自己的项目demo中了,这几天会整理产出到积累里面,然后上传到git。等上传完毕后,会来贴git地址。

VUE 自定义日历+切换上下月+点击事件相关推荐

  1. android vue.js点击反应慢,解决vue 界面在苹果手机上滑动点击事件等卡顿问题

    用vue编写项目接近尾声,需要集成到移动端中,在webstorm上界面,运行效果都很完美,但是在苹果手机上各种问题都出现了,原生项目一向滑动流畅,事件响应迅速,可是苹果手机打开这个项目有两个问题, ( ...

  2. vue移动端点击事件延迟_解决Vue 界面在苹果手机上滑动点击事件等卡顿问题_莺语_前端开发者...

    用 (1).滑动页面卡顿, (2).点击事件响应缓慢,百度才发现在苹果手机上有300ms的延迟. 一.滑动页面卡顿 //页面布局 页面内容 在对应的组件的最外层div上加上这样的样式: .conten ...

  3. vue 界面在苹果手机上滑动点击事件等卡顿解决方案

    用vue编写项目接近尾声,需要集成到移动端中,在webstorm上界面,运行效果都很完美,但是在苹果手机上各种问题都出现了,原生项目一向滑动流畅,事件响应迅速,可是苹果手机打开这个项目有两个问题,(1 ...

  4. vue自定义指令directives实现自动点击事件及自动点击第一个按钮

    业务场景:点击弹窗默认加载第一个按钮的数据.vue自定义指令directives实现这个需求 目录 自动点击所有的按钮. 自动点击第一个按钮, 自动点击所有的按钮. <ul class=&quo ...

  5. Vue自定义组件npm上传私服,且从私服下载使用

    Vue自定义组件npm上传私服,yarn私服下载使用 安装镜像源管理工具nrm 发布自定义组件到公司私服 若未下载nrm源管理工具直接使用npm设置私服地址也可以 以下步骤都是基于npm命令 从私服下 ...

  6. vue自定义组件-文件上传后端接口

    学习目标: vue自定义组件-文件上传后端接口 学习内容: 准备工作: 后端环境:JAVA-Springboot项目数据库表(这里使用psql数据库):sys_file_record保存上传文件的信息 ...

  7. android 微博字体高亮,安卓开发札记——高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现)...

    安卓开发笔记--高仿新浪微博文字处理(实现关键字高亮,自定义表情替换并加入点击事件实现) 先让大家看下效果图,这个是我自己在闲暇时间仿写的新浪微博客户端: 今天来讲讲如何实现上图的效果,这里需要用到S ...

  8. [安卓开发]弹幕滚幕效果自定义View之BarrageView|支持点击事件|隐藏不滞留|颜色随机|大小速度范围随机

    安卓弹幕滚幕效果自定义View之BarrageView|支持点击事件|隐藏不滞留|颜色随机|大小速度范围随机 1.简介 项目地址: https://github.com/tpnet/BarrageVi ...

  9. echarts 地图去除点击事件_echarts 取消图例上的点击事件和图表上鼠标滑过点击事件...

    备注:标黄的代码是起作用的代码,其他的不需要借鉴!!! //取消 鼠标滑过的提示框 tooltip : { trigger: 'item', show:false, formatter: " ...

最新文章

  1. 初识Kubernetes(K8s):理论基础
  2. 通过Samba实现Win/Mac访问Linux
  3. python入门教程 官方-Python自学入门?
  4. vue怎么取消按回车下拉框自动下拉_八月更新第二版,小视频自动竖屏全屏播放,失效校验再次升级!...
  5. 解决Exchange2010中无法显示客户端访问服务器ClientAccessArray中成员的问题
  6. js数组去重,合集等操作
  7. 完善你的Laravel异常处理
  8. es6 Reflect对象简介
  9. [转]Terraform 使用 - 从最简单例子开始
  10. 数值分析(第五版) 第九章知识点总结
  11. 任正非:华为的岗位没有年龄限制;腾讯微博将于9月28日停止运营;微软关闭Visual Studio Online|极客头条
  12. 【数据库原理】滨江学院姜青山 期末试卷知识点笔记整理 南京信息工程大学
  13. 群晖7.X版安装cpolar内网穿透套件
  14. IOS版本APP STORE上架流程
  15. 【Python-Numpy】numpy.random.binomial()的解析与使用
  16. 基于Vue JS, Webpack 以及Material Design的渐进式web应用 [Part 1]
  17. css伪类加垂直分割线
  18. 祝所有程序员1024节日快乐。
  19. 大数据平台开发架构讲解
  20. 小学校园IP网络广播-基于校园局域网的小学IP数字广播系统设计

热门文章

  1. 忘记windows10密码重置密码
  2. 【崩坏学园2 不止】使用unity-studio提取并制作游戏内看板
  3. Yii Framework 开发教程(45) Zii组件-Selectable示例
  4. ArcGIS中建筑物图形简化工具和建筑物群聚合工具的应用
  5. 中小学线上教学平台哪个好?三款让学生居家学习的软件
  6. C++课程设计——健身俱乐部管理
  7. unity解锁_Unity与PiXYZ软件合作以解锁CAD数据以进行实时开发
  8. SWA(Stochastic Weight Averaging)实验
  9. Fastdfs 卸载
  10. bugly上传符号表