vue 写一个日历组件

之前自己写了一个vue的日历demo,那时直接引入cdn的vue.js完成的,功能简单,样式简单,代码还写得乱起八糟,所有现在用vue-cli搭建一个vue项目来重新开发一次,vue--cli搭建vue开发环境可参考https://www.jianshu.com/p/3d44f8269b47

1,新建日历组件

引入reset.css,在assets里新建styles文件夹,将reset.css文件放在styles目录下。

在main.js文件里添加:import './assets/styles/reset.css'


0

记得删除app.vue里的logo


1

然后新建calender.vue。在router文件夹下的index.js改写路由

import Vue from 'vue'

import Router from 'vue-router'

import calender from '@/components/calender'

Vue.use(Router)

export default new Router({

  routes: [

    {

      path: '/',

      name: 'calender',

      component: calender

    }

  ]

})


calender.vue

<template>

  <div class="calender">

  <h5>开始开发</h5>

  </div>

</template>

<script>

export default {

  name: 'calender',

  data () {

    return {


    }

  }

}

</script>

<style scoped>

</style>

然后在:http://localhost:8081,下就可以看到项目效果

2,实现日历组件的样式

仿照其他日历组件的样式:

2


我自己写的样式附代码


3


<template>

  <div class="calender">

    <div class="top">

      <div class="top_date">

        2019年7月

      </div>

      <div class="btn_wrap">

        <ul>

          <li>

            下个月

          </li>

          <li>

            今天

          </li>

          <li>

            上个月

          </li>

        </ul>

      </div>

    </div>

    <div class="date_wrap">

      <ul class="week">

          <li>

            一

          </li>

          <li>

            二

          </li>

            <li>

            三

          </li>

          <li>

            四

          </li>

          <li>

            五

          </li>

          <li>

            六

          </li>

          <li>

            日

          </li>

      </ul>

      <ul class="day">

        <li v-for="item in 42" :key=item>

          {{item}}

        </li>

      </ul>

    </div>

  </div>

</template>

<script>

export default {

  name: 'calender',

  data () {

    return {


    }

  }

}

</script>

<style scoped>

.calender{

  width: 600px;

  position: relative;

  margin: 0 auto;

  margin-top: 50px;

  border: 1px solid #ddd;

  padding: 20px;

}

.top{

  width: 100%;

  position: relative;

  display: flex;

  border-bottom: 1px solid #ddd;

  padding-bottom: 20px;

}

.top_date{

  width: 100px;

  text-align: left;

  line-height: 42px;

}

.btn_wrap{

  flex: 1;

  text-align: right

}

.btn_wrap ul{

  display: flex;

  flex-direction: row-reverse

}

.btn_wrap ul li{

  padding: 10px 20px;

  border: 1px solid #ddd;

  font-size: 14px;

  line-height: 20px;

  cursor: pointer

}

.btn_wrap ul li:first-child{

  border-left: none;

}

.btn_wrap ul li:last-child{

  border-right: none;

}

.date_wrap{

  position: relative;

}

.week{

  display: flex;

  flex-direction: row;

  padding: 20px;

  font-size: 16px;

}

.week li{

  width: 14.28%;

}

.day{

  display: flex;

  flex-direction: row;

  padding: 20px;

  font-size: 16px;

  flex-wrap: wrap;

}

.day li{

  width: 14.28%;

  padding: 20px;

  box-sizing: border-box;

  border: 1px solid #ddd

}

.day li:nth-child(n+8){

  border-top:none;

}

.day li:nth-child(n+1){

  border-right: none;

}

.day li:nth-child(7n){

  border-right: 1px solid #ddd

}

</style>




3,逻辑和功能实现

得到当前date,获取年份,月份,日期,周几,控制选择日期,代码说明看注释

<template>

  <div class="calender">

    <div class="top">

      <div class="top_date">

        {{year}}年{{month}}月

      </div>

      <div class="btn_wrap">

        <ul>

          <li @click="handleShowNextMonth">

            下个月

          </li>

          <li @click="handleShowToday">

            今天

          </li>

          <li @click="handleShowLastMonth">

            上个月

          </li>

        </ul>

      </div>

    </div>

    <div class="date_wrap">

      <ul class="week">

          <li>

            日

          </li>

          <li>

            一

          </li>

          <li>

            二

          </li>

            <li>

            三

          </li>

          <li>

            四

          </li>

          <li>

            五

          </li>

          <li>

            六

          </li>

      </ul>

      <ul class="day">

        <li v-for="(item,index) in days" :key=index>

          {{item}}

        </li>

      </ul>

    </div>

  </div>

</template>

<script>

export default {

  name: 'calender',

  data () {

    return {

    year:'',

    month:'',

    days:[]

    }

  },

  methods:{

    //得到当前年这个月分有多少天

    getDays(Y,M){

      let day = new Date(Y, M, 0).getDate()

      return day;

    },

    //得到当前年,这个月的一号是周几

    getWeek(Y,M){

        let now = new Date()

        now.setFullYear(this.year)

        now.setMonth(this.month-1)

        now.setDate(1);

        let week = now.getDay();

        return week;

    },

    pushDays(){

            //将这个月多少天加入数组days

            for(let i = 1; i<=this.getDays(this.year,this.month);i++){

              this.days.push(i)

            }

            //将下个月要显示的天数加入days

            for(let i = 1;i<=42-this.getDays(this.year,this.month)-this.getWeek(this.year,this.month);i++){

              this.days.push(i)

            }

            //将上个月要显示的天数加入days

            for(let i=0;i<this.getWeek(this.year,this.month);i++){

              var lastMonthDays=this.getDays(this.year,this.month-1)

                this.days.unshift(lastMonthDays-i)

            }s

            console.log(this.days)

            console.log(this.getWeek(this.year,this.month))

    },

    getDate(){

            let now = new Date();

            this.year = now.getFullYear();

            this.month = now.getMonth()+1;

            this.pushDays();


    },

    changeDate(){

    },

    handleShowNextMonth(){

      this.days=[];

      if(this.month<12){

        this.month=this.month+1;

        this.pushDays();

      }else{

        this.month= this.month=1;

        this.year=this.year+1;

        this.pushDays();

      }


    },

    handleShowToday(){

      this.days=[];

      let now = new Date();

      this.year=now.getFullYear();

      this.month=now.getMonth()+1;

      this.pushDays();

    },

    handleShowLastMonth(){

      this.days=[];

      if(this.month>1){

        this.month=this.month-1;

      this.pushDays();

      }else if( this.year>1970){

        this.month=12;

        this.year=this.year-1;

        this.pushDays();

      }else{

        alert("不能查找更远的日期")

      }


    }

  },

  mounted(){

    this.getDate();

  }

}

</script>

<style scoped>

.calender{

  width: 600px;

  position: relative;

  margin: 0 auto;

  margin-top: 50px;

  border: 1px solid #ddd;

  padding: 20px;

}

.top{

  width: 100%;

  position: relative;

  display: flex;

  border-bottom: 1px solid #ddd;

  padding-bottom: 20px;

}

.top_date{

  width: 100px;

  text-align: left;

  line-height: 42px;

}

.btn_wrap{

  flex: 1;

  text-align: right

}

.btn_wrap ul{

  display: flex;

  flex-direction: row-reverse

}

.btn_wrap ul li{

  padding: 10px 20px;

  border: 1px solid #ddd;

  font-size: 14px;

  line-height: 20px;

  cursor: pointer

}

.btn_wrap ul li:first-child{

  border-left: none;

}

.btn_wrap ul li:last-child{

  border-right: none;

}

.date_wrap{

  position: relative;

}

.week{

  display: flex;

  flex-direction: row;

  padding: 20px;

  font-size: 16px;

}

.week li{

  width: 14.28%;

}

.day{

  display: flex;

  flex-direction: row;

  padding: 20px;

  font-size: 16px;

  flex-wrap: wrap;

}

.day li{

  width: 14.28%;

  padding: 20px;

  box-sizing: border-box;

  border: 1px solid #ddd

}

.day li:nth-child(n+8){

  border-top:none;

}

.day li:nth-child(n+1){

  border-right: none;

}

.day li:nth-child(7n){

  border-right: 1px solid #ddd

}

</style>

4,至此,一个日历组件基本完成,最后给当前日期加一个特殊样式

通过  :class="{now:nowLi==year.toString()+month.toString()+item}" 来判断是否是当前日期

nowLi是在methods方法中加以下方法实现,在mounted方法中就要使用该法方法。

//控制当前日期显示特殊样式

    handleShowDateStyle(){

      let now = new Date()

      this.nowLi=now.getFullYear().toString()+(now.getMonth()+1).toString()+now.getDate().toString()

      console.log(this.nowLi)

    },

然后给now加css:

.now{

  background: #f2f8fe;

  color:#1989fa;

}

最后的日历组件完成了:



3

附上项目地址:https://gitee.com/cheng1225/calender

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341