当前位置:首页 > 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组件实现

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

<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>

日历周视图扩展

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

<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的时区插件:

vue实现周切换

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.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…

tabbar 实现 vue

tabbar 实现 vue

在 Vue 中实现 TabBar 功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue Router 结合自定义组件 创建一个自定义的 TabBar 组件,结合 Vue Router 实现…

vue实现banner

vue实现banner

Vue实现Banner轮播 使用Vue实现Banner轮播可以通过第三方库如swiper或vue-awesome-swiper,也可以手动实现基础轮播效果。以下是两种常见方法: 使用vue-…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…