资讯专栏INFORMATION COLUMN

小白成长日记:写个日历

muzhuyu / 1406人阅读

摘要:一周有天,返回的数,如果上月最后一天是星期二,看下的日历是补了三天,我们得到的是,所以为此,之后就是填充最后一天,用处理一下再排序,上一个月的数据就得到了。

每天进步一点点。写个简单的小日历,依旧用vue,方便

完成图

思路

本月的天数

截取上月的天数

截取下月天数

今天给一个样式

上月、下月切换

回到今天

大致需要完成的东西有以上东西

html部分
<

{{year}}-{{month}}

>
{{item}}
{{item}}
本月天数

我主要是将日历的天数分成了3部分,创建了3个数组来保存

 data(){
    return{
        prev:[],
        current:[],
        next:[],
        year:"",
        month:"",
        weeks:["日","一","二","三","四","五","六"],
    }
},

接下来获取本月的天数

 methods:{
    currentInfo(){
        let date=new Date()
        this.year=date.getFullYear()//当年
        this.month=date.getMonth()+1//当月
        let currentDate=new Date(this.year,this.month,0)//当月最后一天
        let currentArr=[...Array(currentDate.getDate()).fill(1)]//创建当月数组,填充1
        this.current=currentArr.map((item,index)=>item+index)//做数组处理
},

当我们在创建本月数组的时候,我们只需要知道本月最后一天是多少号,便知道创建一个多少位的数组。

在获取时,有很多人使用了五花八门的方法,也有的人干脆为最后一天建立两个12位的数组,将最后一天放进去,先判断是不是闰年,再用数组取最后一天的值。

但其实new Date(Y,M,D),取D为0的时候能够取到上一月的最后一天,也无需判断是否是闰年,我偶然间发现的。有兴趣的朋友可以追根溯源去找找原因。

上月
let prevDate=new Date(this.year,this.month-1,0)//上月最后一天
let prevArr=[...Array(prevDate.getDay()+1).fill(prevDate.getDate())]//创建上月数组,填充最后一天
this.prev=prevArr.map((item,index)=>item-index).sort((a,b)=>a-b)//做数组处理

这里先是取到上月最后一天,再取星期,这样就能计算出上月需要有几位补充到当月,取当月第一天也可以。一周有7天,返回0~6的数,如果上月最后一天是星期二,看下windows的日历是补了三天,我们prevDate.getDay()得到的是2,所以为此+1,之后就是填充最后一天,用map处理一下再排序,上一个月的数据就得到了。

下月补充进来的数据毕竟简单,就不多说。完整代码如下:

currentInfo(){
        let date=new Date()
        this.year=date.getFullYear()//当年
        this.month=date.getMonth()+1//当月
        let currentDate=new Date(this.year,this.month,0)//当月最后一天
        let currentArr=[...Array(currentDate.getDate()).fill(1)]//创建当月数组,填充1
        this.current=currentArr.map((item,index)=>item+index)//做数组处理
        /*上月*/
        let prevDate=new Date(this.year,this.month-1,0)//上月最后一天
        let prevArr=[...Array(prevDate.getDay()+1).fill(prevDate.getDate())]//创建上月数组,填充最后一天
        this.prev=prevArr.map((item,index)=>item-index).sort((a,b)=>a-b)//做数组处理
        /*下月*/
        let nextArr=[...Array(6-currentDate.getDay()).fill(1)]//创建下月数组,填充1
        this.next=nextArr.map((item,index)=>item+index)
    },  

这样一个日历的主要部分就完成了,和windows下的日历对比下,一模一样就说明没错

上月和下月按钮

想要获取上月的日历,其实就是重新运行了currentInfo()函数,只是月份取得上月,那很简单,传参

currentInfo(year,month){
        let date=new Date()
        this.year=year||date.getFullYear()//当年
        this.month=month||date.getMonth()+1//当月
        let currentDate=new Date(this.year,this.month,0)//当月最后一天
        let currentArr=[...Array(currentDate.getDate()).fill(1)]//创建当月数组,填充1
        this.current=currentArr.map((item,index)=>item+index)//做数组处理
        /*上月*/
        let prevDate=new Date(this.year,this.month-1,0)//上月最后一天
        let prevArr=[...Array(prevDate.getDay()+1).fill(prevDate.getDate())]//创建上月数组,填充最后一天
        this.prev=prevArr.map((item,index)=>item-index).sort((a,b)=>a-b)//做数组处理
        /*下月*/
        let nextArr=[...Array(6-currentDate.getDay()).fill(1)]//创建下月数组,填充1
        this.next=nextArr.map((item,index)=>item+index)
    }

我们将函数进行如上改造,当有年月参数传入时,就使用参数;当没有年月参数传入时,就使用系统时间的年月。之后只需要做两个按钮函数就行了

prevM(){
        let year,month
        if(this.month!==1){//不是一月,月份递减,年份不变
            month=--this.month
            year=this.year
        }else{//否则年份递减,月份变为12
            month=12
            year=--this.year
        }   
        this.currentInfo(year,month)
    },
nextM(){
        let year,month
        if(this.month!==12){
            month=++this.month
            year=this.year
        }else{
            month=1
            year=++this.year
        } 
        this.currentInfo(year,month)
    },
当天的样式

该如何加当天的样式其实有很多方法,我是先找出当天,然后和循环的index挂钩,判断是否需要加样式
先在data中加入isDay这个数据

currentDay(){
        let date=new Date()                    
        if(this.year===date.getFullYear()&&this.month===date.getMonth()+1){//如果是当年当月
            this.isDay=date.getDate()-1//获取到今天的号数,因为index是从0循环,所以这里-1
        }else{
            this.isDay=""
        }
    },

之后就是通过vue绑定样式,当(今天-1)=index,即:class="isDay===index?"active":"""给此添加一个active样式

回到今天
backDay(){                   
    this.currentInfo()
    this.currentDay()
}
最后
 mounted(){
    this.currentInfo()
    this.currentDay()
}

利用生命周期函数进行初始化(这个应该一开始就做)

源码

https://github.com/yuyeqianxu...
希望能帮助到和我一样的小白朋友们,有bug麻烦反馈,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90084.html

相关文章

  • 小白成长日记写个省市区三级联动

    摘要:数据来源台湾缺省完成图初始化选完省之后部分请选择请选择暂无数据暂无数据一开始的初始状态是省份可以选择,利用来控制市和区的现实选项。当省份未选择时,市区因为没有数据,所以会选择暂无数据。 依旧使用vue,不需要关注dom太方便了。数据来源(台湾缺省):https://github.com/airyland/c... 完成图 初始化 showImg(https://segmentfault...

    JerryC 评论0 收藏0
  • 小白成长日记写个贪吃蛇

    摘要:贪吃蛇并不是通过操作来完成移动的,而是通过记录贪吃蛇的路径来将身体渲染出来。目前没有内置的操作符判断对象的内容是否相同。 还是用的vue,本来以为不合适,但想法错了。贪吃蛇并不是通过操作dom来完成移动的,而是通过记录贪吃蛇的路径来将身体渲染出来。 一般移动元素,我们都是变动它的css达到目的,但我在写贪吃蛇的时候发现这样很难以实现,参考了网上的资源,发现大部分人是通过记录贪吃蛇的路径...

    archieyang 评论0 收藏0
  • 小白成长日记:一步一步写个轮播图插件

    摘要:并不是所有人写的代码或者插件都适合小白使用,比如这是一个的滚动插件,大多数人使用了之后发现滚动不了,去作者提,其实是他们并不懂滚动的原理。 最近在这里看了一篇关于面试的文章《回顾自己三次失败的面试经历》,作者三次倒在了轮播图上。囧,所以我也写个轮播图看看。这次是用jQuery写的,因为最近一直在研究jQuery插件的写法,所以用jQuery写的,而且我发现,我vue用太多,完全不熟悉d...

    notebin 评论0 收藏0
  • Python 基础起步(一)写在开篇的话,写给同为小白的你

    摘要:一个小白的成长日记大家好,这是我在饭否的第一篇笔记,先简单介绍一下自己,我于年在北京工业大学本科毕业,同年月来到法国巴黎工程师学校读研,在年月毕业后加入了法国兴业银行担任数据分析师的职位,主要负责数据质量监测,分析,潜在风险预测,前端可视化 一个小白的成长日记 大家好,这是我在饭否的第一篇笔记,先简单介绍一下自己,我于2016年在北京工业大学本科毕业,同年9月来到法国巴黎Efrei工程...

    shadowbook 评论0 收藏0
  • 你的心事我全知晓——心情日记小程序丨实战

    摘要:闲暇之余,听媳妇嘀咕说要给她做一个能表达她每日心情的小程序,只能她在上面发东西。既然媳妇发话了,就花点心思做一个吧,因为没有图,所有布局全靠自己瞎编,下面结合图片和代码跟大家讲解下实现过程,内容略长,感兴趣的可以一览。 闲暇之余,听媳妇嘀咕说要给她做一个能表达她每日心情的小程序,只能她在上面发东西。既然媳妇发话了,就花点心思做一个吧,因为没有UI图,所有布局全靠自己瞎编,下面结合图片和...

    lylwyy2016 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<