视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue实现简单的日历效果
2020-11-27 21:54:31 责编:小采
文档


最近在项目中遇到了一个需求,在vue中创建一个组件,这个组件显示的是当前的日期,以及在当前的日需要处理的事项,处理的事项的信息会以后端的接口的形式返回。

需求确认后,搭建了一下,在这里记录了一下,现在是简单的实现了这个需求,但是肯定的是后期需要进行修改。

vue就不多说了,在vue中使用的是原生JS

效果图(基本没有样式,很low)

现在实现的都是最初级的版本,代码里面的容错,还有一些性能上的处理,并没有书写。

不多说,上代码:

首先是vue的html结构,很简单,里面添加了一些其他时间形式的显示,可根据具体使用场景增删

<div id="dateContainer">
 <div class="date__showNowTime">
 今天是 <span v-text="ynow"></span>年<span v-text="mnow+1"></span>月<span v-text="dnow"></span>日
 </div>
 <div class="nowTime">
 <button class="preMon" @click="preMon">上个月</button>
 <div class="thisMon">
 <span v-text="ynow"></span>/
 <span v-text="mnow+1"></span>
 </div>
 <button class="nextMon" @click="nextMon">下个月</button>
 </div>
 <table border="1" id="table">
 
 </table>
 
</div>

接下来是实现我们的这个需求的JS代码的位置了,关于js的代码,在代码里面存在一些注释,具体可以根据,代码的注释进行解读

export default {
 data() {
 return {
 newDate: '',//当前的日期的信息
 ynow: '',//当前的年数
 mnow: '',//当前的月份
 dnow: '',//当前的天数
 firstDay: '',//第一天
 firstnow: '',//当前的星期
 m_days: [],//每个月的天数
 tr_str: '',//行数
 }
 },
 methods: {
 getDaysInfo() {
 var _this = this;
 this.sureDate(_this);
 },
 is_leap(year) {//判断是不是闰年
 return (year%100==0?(year%400==0?1:0):(year%4==0?1:0));
 },
 //下面的是画表格的方法,这个方法会根据数据画出我们需要的表格
 drawTable(jsonHtml) {
 var _this = this;
 var str = `
 <tr class="xiqi">
 <td class="isRed">星期日</td>
 <td>星期一</td>
 <td>星期二</td>
 <td>星期三</td>
 <td>星期四</td>
 <td>星期五</td>
 <td class="isRed">星期六</td>
 </tr>`;
 var idx = '',date_str = '',isRed = '',hasMsg='';
 for(var i = 0; i< _this.tr_str; i++) {
 str+='<tr>';
 for(var k = 0; k < 7; k++) {
 
 idx = i*7+k;
 isRed = (k===0||k===6)?"isRed":"";
 date_str=idx-_this.firstnow+1;
 (date_str<=0 || date_str>this.m_days[this.mnow]) ? date_str=" " : date_str=idx-_this.firstnow+1;
 date_str==_this.dnow?hasMsg='<td class="thisDay" date="'+date_str +'"><span class="'+isRed +'">'+date_str+'</span></td>':hasMsg='<td date="'+date_str +'"><span class="'+isRed +'">'+date_str+'</span></td>';
 
 for(var l = 0, len = jsonHtml.length; l < len; l++) {
 if(date_str== jsonHtml[l].date) {
 var newStr = '<p>'+jsonHtml[l].msg +'</p>';
 date_str==_this.dnow?hasMsg='<td class="thisDay" date="'+date_str +'"><span class="'+isRed +'">'+date_str+'</span>'+ newStr+'</td>':hasMsg='<td date="'+date_str +'"><span class="'+isRed +'">'+date_str+'</span>'+ newStr+'</td>';
 
 }
 }
 str+=hasMsg;
 }
 str+='</tr>';
 }
 var table = document.getElementById('table');
 table.innerHTML = str;
 },
 //两个参数代表的含义分别是this对象以及判断当前的操作是不是在进行月份的修改
 sureDate(_this,other) {
 this.newDate = new Date();
 this.ynow = this.newDate.getFullYear();
 if(!other) {
 this.mnow=this.newDate.getMonth(); //月份
 }
 this.dnow=this.newDate.getDate(); //今日日期
 this.firstDay = new Date(this.ynow,this.mnow,1);
 this.firstnow=this.firstDay.getDay();
 this.m_days = [31,28+this.is_leap(this.ynow),31,30,31,30,31,31,30,31,30,31];
 this.tr_str = Math.ceil((_this.m_days[this.mnow] + this.firstnow)/7);
 this.showMsg();
 },
 preMon() {
 var _this = this;
 this.mnow--;
 this.sureDate(_this,"up");
 },
 nextMon() {
 var _this = this;
 this.mnow++;
 this.sureDate(_this,"next");
 },
 //通过接口返回的是我们当前的月份对应在日历中需要处理的事项
 showMsg() {
 var jsonHtml = [{
 date: 2,
 msg: '吃饭'
 },
 {
 date: 3,
 msg: '睡觉'
 },
 {
 date: 4,
 msg: '打豆豆'
 },
 {
 date: 6,
 msg: '豆豆不在家'
 },
 {
 date: 12,
 msg: '~~~~~'
 },
 {
 date: 15,
 msg: '怎么办~~~~'
 },
 {
 date: 20,
 msg: '找豆豆'
 }];
 this.drawTable(jsonHtml)
 }
 
 },
 mounted() {
 //画出当前的月份的天数对应的表格
 this.getDaysInfo();
 //进行数据的获取,显示到对应的位置
 }

js的代码目前的来说也就是这么多,里面只是初步实现了功能,其他什么都没进行处理~~~~

具体的实现可以访问我的github获取--点击打开链接

下载本文
显示全文
专题