当前位置:首页 > VUE

vue实现周切换

2026-01-15 23:42:07VUE

Vue 实现周切换功能

使用日期库计算周范围

推荐使用date-fnsdayjs等轻量日期库处理周计算。以date-fns为例:

import { startOfWeek, endOfWeek, addWeeks, format } from 'date-fns'

// 当前周起始和结束
const currentWeekStart = startOfWeek(new Date(), { weekStartsOn: 1 }) // 周一作为周开始
const currentWeekEnd = endOfWeek(new Date(), { weekStartsOn: 1 })

// 切换周
function changeWeek(weekOffset) {
  const newStart = addWeeks(currentWeekStart, weekOffset)
  const newEnd = addWeeks(currentWeekEnd, weekOffset)
  return { start: newStart, end: newEnd }
}

Vue组件实现

在组件中维护当前周状态并渲染日期:

vue实现周切换

<template>
  <div>
    <button @click="prevWeek">上一周</button>
    <span>{{ formattedWeekRange }}</span>
    <button @click="nextWeek">下一周</button>

    <div v-for="day in weekDays" :key="day">
      {{ format(day, 'yyyy-MM-dd') }}
    </div>
  </div>
</template>

<script>
import { ref, computed } from 'vue'
import { 
  startOfWeek, 
  endOfWeek, 
  addWeeks, 
  format, 
  eachDayOfInterval 
} from 'date-fns'

export default {
  setup() {
    const currentWeekStart = ref(startOfWeek(new Date(), { weekStartsOn: 1 }))

    const weekDays = computed(() => {
      return eachDayOfInterval({
        start: currentWeekStart.value,
        end: endOfWeek(currentWeekStart.value, { weekStartsOn: 1 })
      })
    })

    const formattedWeekRange = computed(() => {
      return `${format(currentWeekStart.value, 'yyyy-MM-dd')} ~ 
              ${format(endOfWeek(currentWeekStart.value), 'yyyy-MM-dd')}`
    })

    function changeWeek(offset) {
      currentWeekStart.value = addWeeks(currentWeekStart.value, offset)
    }

    return {
      weekDays,
      formattedWeekRange,
      prevWeek: () => changeWeek(-1),
      nextWeek: () => changeWeek(1),
      format
    }
  }
}
</script>

日历周视图扩展

如需实现完整日历周视图,可结合表格布局:

vue实现周切换

<template>
  <table>
    <thead>
      <tr>
        <th v-for="day in weekDays" :key="day">
          {{ format(day, 'EEE') }}<br>
          {{ format(day, 'd') }}
        </th>
      </tr>
    </thead>
    <tbody>
      <!-- 时间轴或其他内容 -->
    </tbody>
  </table>
</template>

持久化当前周状态

使用localStorage保存当前周状态:

// 保存
localStorage.setItem('currentWeek', currentWeekStart.value.toISOString())

// 读取
const savedWeek = localStorage.getItem('currentWeek')
if (savedWeek) {
  currentWeekStart.value = new Date(savedWeek)
}

时区处理

如需处理时区问题,可使用dayjs的时区插件:

import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

const localDate = dayjs().tz('Asia/Shanghai')

标签: vue
分享给朋友:

相关文章

vue实现图片分析

vue实现图片分析

Vue 实现图片分析的方法 在 Vue 中实现图片分析通常涉及图片上传、预览、后端交互以及分析结果展示等功能。以下是几种常见的实现方式: 使用 HTML5 File API 和 Canvas 进行前…

vue手动实现弹窗

vue手动实现弹窗

实现弹窗组件的基本结构 在Vue中手动实现弹窗组件,需要创建一个独立的弹窗组件,并通过props控制其显示与隐藏。弹窗组件通常包含遮罩层、内容区域和关闭按钮。 <template>…

vue 实现tabs

vue 实现tabs

Vue 实现 Tabs 组件的方法 使用动态组件和 v-for 在 Vue 中实现 Tabs 可以通过动态组件和 v-for 指令结合完成。定义一个 tabs 数组,包含每个标签的标题和对应的组件。…

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HTM…

vue实现水印

vue实现水印

Vue 实现水印的方法 使用 CSS 背景图 通过 CSS 的 background-image 和 background-repeat 属性实现水印效果。创建一个包含水印文本的 Canvas,将其转…