基于VUE的考勤日历(带图标)

本文介绍了如何在Vue项目中创建一个考勤日历组件,包括多个子组件如calendar、dateCell等,以及如何通过后台接口获取数据,根据考勤状态(如请假、出差)展示不同图标。
摘要由CSDN通过智能技术生成

1、在src文件夹下创建文件名为scheduleCalendar的文件夹,与page并列。

2、scheduleCalendar文件里

(1)、calendar.vue

<template>
  <div class="schedule-calendar">
    <header-bar :year="year"
    :month="month"
    @updateValue="updateView"></header-bar>
    <div class="schedule-calendar-body">
      <week :startWeek="startWeek"></week>
      <month :year="year"
      :month="month"
      :startWeek="startWeek"
      :data="events"
      :itemRender="dateItemRender"></month>
    </div>
  </div>
</template>
<script>
  import { EventBus } from './utils'
  import headerBar from './header'
  import week from './week'
  import month from './month'

  export default {
    name: 'schedule-calendar',
    components: {
      headerBar,
      week,
      month,
    },
    props: {
      startMonth: String,
      startWeek: {
        type: Number,
        default: 1
      },
      events: {
        type: Array,
        default: []
      },
      dateItemRender: Function
    },
    data() {
      return {
        year: new Date().getFullYear(),
        month: new Date().getMonth(),
        dragItem: null
      }
    },
    methods: {
      updateView(year, month) {
        this.year = year
        this.month = month
        this.$emit('dateSelect', year, month)
      },
      cellDragenter(e, date, type, index) {
        this.$emit('event-dragenter', e, this.dragItem, date)
      },
      itemDragstart(e, item, date, type) {
        this.dragItem = item
        this.$emit('event-dragstart', e, item, date)
      },
      itemDrop(e, date, type, index) {
        if (!this.dragItem) return
          // console.log('[event-dragend]:', this.dragItem, date)
        this.$emit('event-dragend', e, this.dragItem, date)
      },
      itemClick(e, item) {
        // console.log('[event-click]:', item)
        this.$emit('event-click', e, item)
      },
      dateClick(e, date) {
        // console.log('[date-click]:', date)
        this.$emit('date-click', e, date)
      }
    },
    created() {
      EventBus.$on('cell-dragenter', this.cellDragenter)
      EventBus.$on('item-dragstart', this.itemDragstart)
      EventBus.$on('item-drop', this.itemDrop)
      EventBus.$on('item-click', this.itemClick)
      EventBus.$on('date-click', this.dateClick)
      EventBus.$on('dateSelect', this.updateView)
    },
    destoryed() {
      EventBus.$off()
    }
  }
</script>
<style lang="less">
@import "./variables.less";

.schedule- {
  &calendar {
    height: 500px;
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    /*height: 100%;*/
    border: 1px solid #e8e8e8;
    min-width: @sc-cell-min-width * 7;
    color: @sc-base-color;
    font-size: @sc-base-font-size;
    box-shadow: @sc-box-shadow;

    *,
    *::before,
    *::after {
      box-sizing: border-box;
    }

    button {
      border: 0;
      outline: none;
      cursor: pointer;
      background: transparent;
    }

    &-body {
      position: relative;
      flex: 1;
      width: 100%;
      overflow: hidden;
      background: @sc-body-color;
    }
  }
}

</style>

(2)、dateCell.vue

<template>
  <div class="schedule-calendar-date"
  :class="[type, { today: isToday, dragged: draggedIndex === index }]"
  @dragover.prevent=""
  @dragenter.prevent="dragenter"
  @drop="onDrop"
  @click="cellClick">
  <div class="schedule-calendar-date-hd">
    <div class="schedule-calendar-date-label">{
  {date.getDate()}}</div>
    <!-- <button type="button"
    class="schedule-calendar-counter"
    v-if="details.length > volume"
    @click.stop.prevent="expandAll">共 {
  {details.length}} 项</button> -->
  </div>
  <div class="schedule-calendar-details"
  :class="{ expanded }"
  :style="detailsPost"
  ref="details">
  <div v-show="expanded"
  class="schedule-calendar-details-hd">{
  { dateString }}</div>
  <div class="schedule-calendar-details-bd">
    <event-item v-if="details.length"
    v-for="item in displayDetails"
    :item="item"
    :date="date"
    :type="type"
    :itemRender="itemRender"
    @item-dragstart="dragItem"
    :key="item.id"></event-item>
  </div>
</div>
</div>
</template>
<script>
  import { EventBus, isSameDay, format, Store } from './utils'
  import eventItem from './eventItem'

  export default {
    components: {
      eventItem
    },
    props: {
      date: Date,
      type: String,
      data: Array,
      index: Number,
      draggedIndex: Number,
      itemRender: Function
    },
    data() {
      return {
        volume: 0,
        expanded: false
      }
    },
    computed: {
      isToday() {
        return isSameDay(new Date(), this.date)
      },
      details() {
        return this.data.length ? this.data.filter(item => isSameDay(item.date, this.date)) : []
      },
      displayDetails() {
        return this.expanded ? this.details : this.details.sl
基于Vue日历组件开发是通过使用Vue框架来构建一个功能完善的日历组件。该组件可以方便地显示日期、选择日期、切换月份、展示事件等功能。 首先,我们需要创建一个Vue组件,并在其中设置一个日历数据模型。该数据模型包括当前展示的年份、月份,以及当月的日期列表。通过使用Vue的双向绑定,我们可以动态地更新日历的展示内容。 接下来,我们可以在组件中编写一些方法来实现日历的一些功能,例如切换月份、选择日期等。切换月份方法可以根据用户的操作来切换到下个月或上个月的日历数据,并且更新组件的展示。选择日期方法可以监听用户的点击事件,并更新选中日期的样式。 除了基本的日历展示和选择功能,我们还可以考虑添加一些其他的功能。例如,可以在日历中添加事件,并将事件与选中的日期关联起来。可以通过弹窗来添加、编辑和删除事件,并在日历中展示出来。可以通过设定不同的事件类型,如会议、生日等,并为每种类型设置不同的样式。 此外,还可以考虑添加一些设计元素来提高用户体验。例如,可以在日历组件中加入一些动画效果,让切换月份或选择日期变得更加平滑。可以为不同的日期添加不同的背景色,以突出重要的日期。 综上所述,基于Vue日历组件开发可以提供一个方便实用的日历功能,并通过使用Vue的特性和灵活性,使得开发过程更为简单和高效。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值