vue2手写日历组件

最近的项目用到了日历组件,但是element的日历组件功能实在是太差了,一些基本的功能都没有,样式也没有接口,想自定义样式比较麻烦,我就想手写一个日历组件


我找了好多文章,在这篇文章下拿到了一个完整的日历组件,我又稍微改了一下,实现一个简单的效果
vue手写日历
话不多说,直接上代码

<template>
  <div class="page">
    <ul class="calendar">
      <div
        style="
          display: flex;
          justify-content: space-between;
          align-items: center;
        "
      >
        <span
          style="font-size: 30px; margin-left: 50px; cursor: pointer"
          @click="prevDayclick(1)"
        >
          <
        </span>
        <li class="header" style="justify-content: center" >
          {{
            currentYear +
            "年" +
            (currentMonth + 1) +
            "月"
          }}
        </li>
        <span
          style="font-size: 30px; margin-right: 50px; cursor: pointer"
          @click="nextDayclick(1)"
          >></span
        >
      </div>
      <li class="week" >
        <p ></p>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
      </li>
      <li class="row day">
        <span
          @click="prevDayclick(item)"
          class="date prevDay"
          v-for="item in prevDays"
          :key="'A' + item"
          >{{ item }}</span
        >
        <span
          @click="clickdate(item)"
          v-for="item in currentDays"
          :key="'B' + item"
          class="date nowm"
          :class="{
            jintian: currentDay == item
          }"
          >{{ item }}</span
        >
        <span
          @click="nextDayclick(item)"
          class="date prevDay"
          v-for="item in nextDays"
          :key="'A' + item"
          >{{ item }}</span
        >
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data () {
    return {
      week: ['日', '一', '二', '三', '四', '五', '六'],
      currentDay: new Date().getDate(),
      currentDay2: new Date().getDate(),
      currentMonth: new Date().getMonth(),
      currentYear: new Date().getFullYear()
    }
  },
  watch: {
    currentMonth (newv, oldv) {
      if (newv === new Date().getMonth()) {
        document.getElementsByClassName('nowm')[this.currentDay2 - 1].style.color = '#3F62AE'
      }
    }
  },
  computed: {
    currentMonthChinese () {
      return new Date(this.currentYear, this.currentMonth).toLocaleString(
        'default',
        { month: 'short' }
      )
    },
    currentDays () {
      return new Date(this.currentYear, this.currentMonth + 1, 0).getDate()
    },
    prevDays () {
      let data = new Date(this.currentYear, this.currentMonth, 0).getDate()
      let num = new Date(this.currentYear, this.currentMonth, 1).getDay()
      const days = []
      while (num > 0) {
        days.push(data--)
        num--
      }
      return days.sort()
    },
    nextDays () {
      const m = this.currentMonth + 1
      let num = new Date(this.currentYear, m, 1).getDay()
      const days = []
      let number = 0
      while (num < 7) {
        number++
        days.push(number)
        num++
      }
      return days.sort()
    },
    zongdate () {
      return this.currentYear + '-' + (this.currentMonth + 1) + '-' + this.currentDay
    }
  },
  methods: {
    change () {
      this.currentMonth = Number(this.inputVal) - 1
    },
    clickdate (val) {
      this.currentDay = val
      if (this.currentMonth === new Date().getMonth() && this.currentDay !== new Date().getDate()) {
        document.getElementsByClassName('nowm')[this.currentDay2 - 1].style.color = '#3F62AE'
      }
      console.log(this.zongdate)
    },
    prevDayclick (val) {
      this.currentDay = val
      this.currentMonth = Number(this.currentMonth) - 1
      document.getElementsByClassName('nowm')[this.currentDay2 - 1].style.color = 'black'
      if (this.currentMonth < 0) {
        this.currentMonth = 11
        this.currentYear = Number(this.currentYear - 1)
      }
      console.log(this.zongdate)
    },
    nextDayclick (val) {
      this.currentDay = val
      this.currentMonth = Number(this.currentMonth) + 1
      document.getElementsByClassName('nowm')[this.currentDay2 - 1].style.color = 'black'
      if (this.currentMonth > 11) {
        this.currentMonth = 0
        this.currentYear = Number(this.currentYear + 1)
      }
      console.log(this.zongdate)
    }
  }
}
</script>

<style lang="scss">
.calendar {
  width: 500px;
  .header {
    display: flex;
    align-items: center;
    height: 64px;
    border-radius: 4px 4px 0px 0px;
    font-size: 28px;
    font-family: PingFangSC-Semibold, PingFang SC;
    font-weight: 600;
    color: #404040;
    padding-left: 20px;
  }
  .week {
    display: flex;
    height: 64px;
    background: #fefefe;
    font-size: 24px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #404040;
    p {
      width: 100px;
      height: 64px;
    }
  }
  .row {
    width: 100%;
    display: flex;
    justify-content: space-between;
  }
  .day {
    -webkit-box-pack: start;
    -ms-flex-pack: start;
    justify-content: flex-start;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
    span {
      width: 100px;
      height: 30px;
      line-height: 30px;
      text-align: center;
    }
    .date {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 71px;
      height: 71px;
      font-size: 28px;
      font-family: PingFangSC-Medium, PingFang SC;
      font-weight: 500;
      color: black;
    }
    .date:hover {
      border-radius: 50%;
      background-color: #3f62ae;
      color: black!important;;
      cursor: pointer;
    }
    .nowDay {
      background: #404040;
    }
  }
}
.jintian {
  border-radius: 50% !important;
  background-color: #3f62ae !important;
  color: black !important;
}
.prevDay{
  color: #ccc!important;
}
</style>

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
基于Vue日历组件开发是通过使用Vue框架来构建一个功能完善的日历组件。该组件可以方便地显示日期、选择日期、切换月份、展示事件等功能。 首先,我们需要创建一个Vue组件,并在其中设置一个日历数据模型。该数据模型包括当前展示的年份、月份,以及当月的日期列表。通过使用Vue的双向绑定,我们可以动态地更新日历的展示内容。 接下来,我们可以在组件中编写一些方法来实现日历的一些功能,例如切换月份、选择日期等。切换月份方法可以根据用户的操作来切换到下个月或上个月的日历数据,并且更新组件的展示。选择日期方法可以监听用户的点击事件,并更新选中日期的样式。 除了基本的日历展示和选择功能,我们还可以考虑添加一些其他的功能。例如,可以在日历中添加事件,并将事件与选中的日期关联起来。可以通过弹窗来添加、编辑和删除事件,并在日历中展示出来。可以通过设定不同的事件类型,如会议、生日等,并为每种类型设置不同的样式。 此外,还可以考虑添加一些设计元素来提高用户体验。例如,可以在日历组件中加入一些动画效果,让切换月份或选择日期变得更加平滑。可以为不同的日期添加不同的背景色,以突出重要的日期。 综上所述,基于Vue日历组件开发可以提供一个方便实用的日历功能,并通过使用Vue的特性和灵活性,使得开发过程更为简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值