vue实现日历组件

基于VUE实现日历组件,供大家参考,具体内容如下

年和月份是使用输入框来切换的,没有做成选择框,️和️切换月份,红色选取是选取的日期
实现思路和网上的大多数一样,首先是把月份的天数存进一个数组,

monthDay:[31,'',31,30,31,30,31,31,30,31,30,31],

由于二月的天数是不确定的,所以就先设置为空

然后去求选择的月份的第一天是星期几,通过 Date.getDay()函数,这个函数有一个注意事项,就是如果是星期天,他会返回0,这需要我们自己去处理一下

图中,2019年1月1号是星期二,所以前面就要给它一个空格块
下面代码中第一层循环就是在循环空格块,spaceDay表示需要几个空格

<p v-for="item in spaceDay" :key="item.id"></p>
<p v-for="(item,idx) in (monthDay[this.month-1] || 30)" @click="setDay(idx)" :class="idx==activeDay?'active':''" :key="item.id">{{item}}</p>

下面贴出完整代码

<template>
    <div id="calender">
        <div class="txt-c p-10">
            <span @click="prev"> ️ </span>
            <input type="text" v-model="year">年
            <input type="text" v-model="month" class="month">月
            <span @click="next"> ️️️️ </span>
        </div>
        <div class="weekDay flex jc-sb p-5 day" >
            <p v-for="item in weekList" :key="item.id">{{item}}</p>
        </div>
        <div class="weekDay flex p-5 day">
            <p v-for="item in spaceDay" :key="item.id"></p>
            <p v-for="(item,idx) in (monthDay[this.month-1] || 30)" @click="setDay(idx)" :class="idx==activeDay?'active':''" :key="item.id">{{item}}</p>
        </div>
    </div>
</template>

<script>
    export default {
        name: "calender",
        data(){
            return{
                year: '', // 年份
                month: '', // 月份
                day: '', // 天数
                current: '', // 当前时间
                weekList:['周一','周二','周三','周四','周五','周六','周日'],
                monthDay:[31,'',31,30,31,30,31,31,30,31,30,31],
                activeDay: '', // 选中的日期
                spaceDay: '', // 每个月第一天是星期几
                February:'' // 判断2月份的天数
            }
        },
        created(){
            this.current = new Date()
            this.getTheCurrentDate()
            this.getMonthFisrtDay()
            this.February = this.isLeapYear(this.year) ? 28 : 29
            this.monthDay.splice(1,1,this.February)
        },
        watch:{
          month(){
              if(this.month>12||this.month<1){
                  console.log('请输入正确月份')
                  return
              }
              this.getMonthFisrtDay()
          },
          year(){
              this.getMonthFisrtDay()
          }
        },
        methods:{
            // 判断是否是闰年
            isLeapYear(year){
            
                return year % 4 == 0 && year % 100 != 0 ||year % 400 == 0;
            },
            // 选取特定天数
            setDay(idx){
                this.activeDay = idx
                this.day = idx + 1
                console.log('选择的日期是'+this.year+' '+this.month+' '+this.day)
            },
            // 判断月份的第一天是星期几
            getMonthFisrtDay(){
                var firstDayOfCurrentMonth = new Date(this.year,this.month-1,1) // 某年某月的第一天
                if(firstDayOfCurrentMonth.getDay() == 0){
                    this.spaceDay = 6
                } else {
                    this.spaceDay = firstDayOfCurrentMonth.getDay() - 1
                }
            },
            // 获取当前的日期
            getTheCurrentDate(){
                this.year = this.current.getFullYear()
                this.month = this.current.getMonth() + 1
                this.day = this.current.getDate()
            },
            prev(){
                if(this.month==1){
                    this.year--
                    this.month=12
                }else{
                    this.month--
                }
                this.activeDay = 0
                this.getMonthFisrtDay()
            },
            next(){
                if(this.month==12){
                    this.year++
                    this.month=1
                }else{
                    this.month++
                }
                this.activeDay = 0
                this.getMonthFisrtDay()
            }
        }
    }
</script>

<style lang="scss" scoped>
#calender{
    .txt-c{
        text-align: center;
    }
    .p-10{
        padding: 2rem;
    }
    .p-5{
        padding: 1rem;
    }
    .flex {
        display: flex;
    }
    .jc-sb{
        justify-content: space-between;
    }
    input{
        width: 50px;
        &.month{
            width: 30px;
        }
    }
    .day{
        flex-wrap: wrap;
        p{
            width: 14.28%;
            /*flex: 0 0 0 ;*/
            text-align: center;
            line-height: 2.4rem;
            height: 2.4rem;
            position: relative;
            z-index: 100;
            &.active{
                color: #fff;
            }
            &.active:before{
                content: '';
                height: 2.5rem;
                width: 2.5rem;
                position: absolute;
                z-index: -1;
                left: 0;
                top: 0;
                transform: translateX(50%);
                border-radius: 50%;
                background: #e97163;
                color: #fff;
            }
        }
    }
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Vue2-Calendar改进的日历组件(含中文使用说明)

    一,前言 我是刚学Vue的菜鸟,在使用过程中需要用到日历控件,由于项目中原来是用jQuery写的,因此用了bootstarp的日历控件,但是配合Vue实在有点蛋疼,不够优雅-- 于是网上搜了好久找到了Vue2-Calendar,不用说,挺好用的,但是同时也发现这个组件有些问题,有些功能挺不符合我们的要求,于是着手改了一版 二,改进的功能 在Vue2-Calendar v2.2.4 版基础上作了优化. 1.改进原控件无法切换语言的BUG,支持 lang='zh-CN'和'en'. 2.日历面板增加

  • 从零写vue日历组件

    目录 1.前言 2.vue日历制作 2.1制作月份选择器 2.2制作日历 2.2.1获取当前月所要显示的日期 2.2.2给不同的日期添加不同的样式 2.3将月份选择器和日历组件组合使用 2.4编辑功能 1. 前言 最近做项目遇到一个需求,需要制作一个定制化的日历组件(项目使用的UI框架不能满足需求,算了,我直说了吧,ant design vue的日历组件是真的丑,所以就自己写了一个),如下图所示,需求大致如下:(2)日历可以按照月份进行上下月的切换.(2)按照月份展示周一到周日的排班信息.(3)

  • vue日历组件的封装方法

    本文实例为大家分享了vue日历组件的封装代码,供大家参考,具体内容如下 图示 封装的组件的代码如下 <template>   <div class="calendar">     <!-- 选择日历的弹出层 -->     <div class="model_mask" v-show="showtimemask" @click="showmask1()">     </di

  • vue版日历组件的实现方法

    开发背景 常用日历组件可能满足不了我们自定义的多种需求(比如样式),因此通常情况下我们可能需要自己手动开发款日历,先上图 开发流程 1. 根据常用日历样式,我们template部分可以分为三部分(上下月及当前月份展示:周日至周六展示:主体日期展示三部分) 1) template部分代码 <div class="date">     <div class="header">         <span class="pre_mo

  • vue实现垂直无限滑动日历组件

    用vue做了一个垂直无限滑动日历,在这里记录一下实现. 效果 组件 verticalCalendar.vue <template>   <div ref="container" class="calendar-vt">     <div class="top-month">{{ currentMonth }}月</div>     <ul ref="scroll" clas

  • vue自定义可选时间的日历组件

    本文实例为大家分享了vue自定义可选时间日历组件的具体代码,供大家参考,具体内容如下 日历功能: 1.过去时间不可选择 2.可自定义不可选时间 3.本月默认展示当天,其他月展示第一天,若为不可选时间,往后顺延 效果图: -------下面开始表演----------- **首先,画出日历页面布局,参照win10系统日历布局*6行7列,为何如此,请自行理解-*本人也是"偷窥"来的 beginDay是当前月第一天的周几,prevMdays是上个月总天数,nowMdays是当月总天数,这样就

  • vue中使用element日历组件的示例代码

    先看下效果图: 完整代码附上 <template> <div class="newSeeds" id="famerCalendar"> <div class="title-bottom"> <el-date-picker :clearable="false" prefix-icon="timeFilter" v-model="value2" ty

  • VUE实现日历组件功能

    哈哈, 就在昨天笔者刚刚在Github 上发布了一个基于VUE的日历组件.过去做日历都是需要引用 jquery moment 引用 fullCalendar.js 的.几者加起来体积庞大不说,也并不是很好使用在vue这种数据驱动的项目里.所以笔者经过一周的拍脑袋,做了一个十分简陋的版本. 简介 目前只支持月视图,该组件是 .vue 文件的形式.所以,大家在使用的时候 是需要node的咯~~~ 安装 npm install vue-fullcalendar DEMO 针对这个组件, 本人做了一个十

  • vue实现一个炫酷的日历组件

    公司业务新开了一个商家管理微信H5移动端项目,日历控件是商家管理员查看通过日程来筛选获取某日用户的订单等数据. 如图: 假设今天为2018-09-02 90天前: 90天后; 产品需求: 展示当前日期(服务器时间)前后90天,一共181天的日期. 日历可以左右滑动切换月份. 当月份的如果不在181天区间的,需要置灰并且不可点击. 点击日历绑定的节点的外部,关闭弹窗. 涉及内容: 获取服务器时间,渲染日历数据 vue-touch监听手势滑动事件 ios日期兼容处理 clickOutSide自定义指

  • vue实现日历组件

    基于VUE实现日历组件,供大家参考,具体内容如下 年和月份是使用输入框来切换的,没有做成选择框,️和️切换月份,红色选取是选取的日期实现思路和网上的大多数一样,首先是把月份的天数存进一个数组, monthDay:[31,'',31,30,31,30,31,31,30,31,30,31], 由于二月的天数是不确定的,所以就先设置为空 然后去求选择的月份的第一天是星期几,通过 Date.getDay()函数,这个函数有一个注意事项,就是如果是星期天,他会返回0,这需要我们自己去处理一下 图中,201

  • vue自定义全局组件(自定义插件)的用法

    有时候我们在做开发的时候,就想自己写一个插件然后就可以使用自己的插件,那种成就感很强.博主最近研究element-ui和axios的时候,发现他们是自定义组件,但是唯一有一点不同的是,在用element-ui的时候是使用Vue.use()语句来使用的,而axios的时候,不用Vue.use(),只要import就可以导入进来了,感觉很神奇,细细的发现,原来他们的不同是因为axios里面并没有写install方法,而element-ui就有写这个方法,下面就利用这个install来写一个自己的插件

  • Vue中UI组件库之Vuex与虚拟服务器初识

    一.日历组件 new Date()的月份是从0开始的. 下面表达式是:2018年6月1日 new Date(2018, 5, 1); 下面表达式是:2018年5月1日 new Date(2018, 4, 1); 或 new Date(2018, 5-1, 1); 下面表达式是:2018年5月31日(得到上个月的最后一天) new Date(2018, 5 , 0); 日的参数可以是0,也可以是负数,表示上个月底的那一天. 下面表达式是:2018年7月01日 new Date(2018, 5, 3

随机推荐