当前位置:首页 > 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 CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue实现人脸识别比对

vue实现人脸识别比对

Vue 实现人脸识别比对的方法 使用现成的人脸识别 API 通过调用第三方人脸识别 API(如 Face++、百度 AI、腾讯云等)实现比对功能。注册开发者账号获取 API Key 和 Secret,…

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue按钮实现截屏

vue按钮实现截屏

Vue 按钮实现截屏的方法 在 Vue 项目中实现截屏功能可以通过多种方式完成,以下是几种常见的方法: 使用 html2canvas 库 安装 html2canvas 库: npm insta…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

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

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…