当前位置:首页 > 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中循环数组主要通过v-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue实现多个tab

vue实现多个tab

Vue 实现多个 Tab 的方法 使用动态组件切换 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现多个…

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用i…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue…

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在V…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…