当前位置:首页 > VUE

vue实现周界面

2026-03-09 23:50:50VUE

Vue实现周界面的方法

使用第三方库(如vue-cal

安装vue-cal库:

npm install vue-cal --save

在组件中引入并使用:

<template>
  <vue-cal
    :time="false"
    :disable-views="['years', 'day']"
    active-view="week"
  />
</template>

<script>
import VueCal from 'vue-cal'
import 'vue-cal/dist/vuecal.css'

export default {
  components: { VueCal }
}
</script>

手动实现基础周视图

创建日期计算工具方法:

// utils/date.js
export const getWeekDays = (date = new Date()) => {
  const day = date.getDay()
  const diff = date.getDate() - day + (day === 0 ? -6 : 1)
  return Array(7).fill(0).map((_, i) => {
    const d = new Date(date)
    d.setDate(diff + i)
    return d
  })
}

组件实现:

<template>
  <div class="week-view">
    <div class="week-header">
      <div v-for="day in weekDays" :key="day">
        {{ day.toLocaleDateString('en-US', { weekday: 'short' }) }}
      </div>
    </div>
    <div class="week-body">
      <div v-for="day in weekDays" :key="day.getTime()" class="day-cell">
        {{ day.getDate() }}
      </div>
    </div>
  </div>
</template>

<script>
import { getWeekDays } from '@/utils/date'

export default {
  data() {
    return {
      weekDays: getWeekDays()
    }
  }
}
</script>

<style>
.week-view {
  display: grid;
  grid-template-rows: auto 1fr;
}
.week-header {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}
.week-body {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}
.day-cell {
  min-height: 100px;
  border: 1px solid #eee;
}
</style>

增强周视图功能

添加导航控制:

<template>
  <div>
    <button @click="prevWeek">Previous</button>
    <span>{{ currentWeekRange }}</span>
    <button @click="nextWeek">Next</button>

    <div class="week-view">
      <!-- 周视图内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentDate: new Date()
    }
  },
  computed: {
    weekDays() {
      return getWeekDays(this.currentDate)
    },
    currentWeekRange() {
      const start = this.weekDays[0]
      const end = this.weekDays[6]
      return `${start.toLocaleDateString()} - ${end.toLocaleDateString()}`
    }
  },
  methods: {
    prevWeek() {
      const d = new Date(this.currentDate)
      d.setDate(d.getDate() - 7)
      this.currentDate = d
    },
    nextWeek() {
      const d = new Date(this.currentDate)
      d.setDate(d.getDate() + 7)
      this.currentDate = d
    }
  }
}
</script>

添加事件展示功能

扩展day-cell显示事件:

vue实现周界面

<template>
  <div class="day-cell" @click="addEvent(day)">
    <div class="day-number">{{ day.getDate() }}</div>
    <div 
      v-for="event in getEventsForDay(day)" 
      :key="event.id"
      class="event"
    >
      {{ event.title }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      events: [
        { id: 1, title: 'Meeting', date: new Date(2023, 5, 12) }
      ]
    }
  },
  methods: {
    getEventsForDay(day) {
      return this.events.filter(event => 
        event.date.toDateString() === day.toDateString()
      )
    },
    addEvent(day) {
      // 实现添加事件逻辑
    }
  }
}
</script>

<style>
.event {
  background: #e3f2fd;
  margin: 2px;
  padding: 2px;
  border-radius: 3px;
  font-size: 0.8em;
}
</style>

标签: 周界vue
分享给朋友:

相关文章

vue实现裁剪头像

vue实现裁剪头像

Vue 实现头像裁剪功能 实现头像裁剪功能通常需要结合第三方库如 cropperjs 或 vue-cropper。以下是两种常见实现方式: 使用 vue-cropper 库 安装依赖: n…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现 toast

vue实现 toast

Vue 实现 Toast 组件 在 Vue 中实现 Toast 组件可以通过多种方式完成,以下是几种常见的方法: 使用全局组件和事件总线 创建一个全局的 Toast 组件,并通过事件总线或 Vue…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…

vue实现mvvm

vue实现mvvm

Vue 实现 MVVM 模式 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 是其典型实现之一。MVVM 的核心是通过数据绑定和响应式系统实现视图与数据的自动同步。…