最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3的定時器cron組件詳解

 更新時間:2025年10月25日 11:33:28   作者:不想長胖的可樂鴨  
該文章介紹了如何在Vue3和Antd-Vue中實現(xiàn)一個定時任務(wù)調(diào)度組件,該組件支持每日定時任務(wù),并返回cron格式的字符串,父組件調(diào)用該組件后,會得到一個cron格式的時間字符串,表示任務(wù)的執(zhí)行時間,例如,“000009***”表示每天的9點

先看圖

僅適用于vue3+antd-vue,僅對業(yè)務(wù)需求,每日定時。

實現(xiàn)功能如下:

話不多說,上組件代碼

組件代碼如下,如需改動,找ai就完事

<!-- src/components/CronEditor.vue -->
<template>
  <div class="cron-editor">
    <a-form-item label="推送頻率" :labelCol="{ span: 4 }">
      <a-radio-group v-model:value="cronType" @change="onTypeChange">
        <a-radio value="daily">每天</a-radio>
        <a-radio value="weekly">每周</a-radio>
      </a-radio-group>
    </a-form-item>

    <a-form-item v-if="cronType === 'daily'" label="推送時間" :labelCol="{ span: 4 }">
      <a-time-picker
        :value="dailyTime"
        format="HH:mm"
        value-format="HH:mm"
        @change="onDailyTimeChange"
      />
    </a-form-item>

    <template v-if="cronType === 'weekly'">
      <a-form-item label="選擇星期" :labelCol="{ span: 4 }">
        <a-checkbox-group v-model:value="selectedWeekdays" @change="onWeekdaysChange">
          <a-checkbox v-for="day in weekdays" :key="day.value" :value="day.value">
            {{ day.label }}
          </a-checkbox>
        </a-checkbox-group>
      </a-form-item>

      <a-form-item label="推送時間" :labelCol="{ span: 4 }">
        <a-time-picker
          :value="weeklyTime"
          format="HH:mm"
          value-format="HH:mm"
          @change="onWeeklyTimeChange"
        />
      </a-form-item>
    </template>
  </div>
</template>

<script setup lang="ts">
import { ref, watch } from 'vue'

const props = defineProps<{
  modelValue?: string
}>()

const emit = defineEmits<{(e: 'update:modelValue', value: string): void}>()

// Cron 類型:每天或每周
const cronType = ref<'daily' | 'weekly'>('daily')

// 每天推送的時間
const dailyTime = ref<string>('09:00')

// 每周推送的星期選擇
const selectedWeekdays = ref<number[]>([1]) // 默認(rèn)周一

// 每周推送的時間
const weeklyTime = ref<string>('09:00')

// 星期選項
const weekdays = [
  { value: 1, label: '周一' },
  { value: 2, label: '周二' },
  { value: 3, label: '周三' },
  { value: 4, label: '周四' },
  { value: 5, label: '周五' },
  { value: 6, label: '周六' },
  { value: 7, label: '周日' }
]

// 當(dāng)類型改變時重置時間
const onTypeChange = () => {
  if (cronType.value === 'daily') {
    generateDailyCron()
  } else {
    generateWeeklyCron()
  }
}

// 處理每天時間變化
const onDailyTimeChange = (time: string | string[], timeString: string) => {
  dailyTime.value = timeString
  generateDailyCron()
}

// 處理每周時間變化
const onWeeklyTimeChange = (time: string | string[], timeString: string) => {
  weeklyTime.value = timeString
  generateWeeklyCron()
}

// 處理星期選擇變化
const onWeekdaysChange = (values: number[]) => {
  selectedWeekdays.value = values
  generateWeeklyCron()
}

// 生成每天的 cron 表達式
const generateDailyCron = () => {
  const time = dailyTime.value || '09:00'
  const [hour, minute] = time.split(':')
  const cron = `00 ${minute} ${hour} * * *`
  emit('update:modelValue', cron)
}

// 生成每周的 cron 表達式
const generateWeeklyCron = () => {
  if (selectedWeekdays.value.length === 0) return

  const time = weeklyTime.value || '09:00'
  const [hour, minute] = time.split(':')

  // 如果選擇了所有星期(周一到周日),則生成每天的cron表達式
  if (selectedWeekdays.value.length === 7) {
    const cron = `00 ${minute} ${hour} * * *`
    emit('update:modelValue', cron)
  } else {
    const days = selectedWeekdays.value.sort().join(',')
    const cron = `00 ${minute} ${hour} * * ${days}`
    emit('update:modelValue', cron)
  }
}

// 解析傳入的 cron 表達式
const parseCronExpression = (cron: string) => {
  if (!cron) return

  const parts = cron.split(' ')
  // 現(xiàn)在期望接收6個部分(包含秒)而不是5個部分
  if (parts.length !== 6) return

  // 解構(gòu)出秒字段,但我們在解析時忽略它
  const [second, minute, hour, dayOfMonth, month, dayOfWeek] = parts

  // 判斷是每天還是每周
  if (dayOfMonth === '*' && month === '*' && dayOfWeek === '*') {
    // 每天
    // cronType.value = 'daily'
    dailyTime.value = `${hour}:${minute}`
  } else if (dayOfMonth === '*' && month === '*' && dayOfWeek !== '*') {
    // 每周
    cronType.value = 'weekly'
    weeklyTime.value = `${hour}:${minute}`
    selectedWeekdays.value = dayOfWeek.split(',').map(Number)
  }
}

// 監(jiān)聽 modelValue 變化
watch(() => props.modelValue, (newVal) => {
  if (newVal) {
    parseCronExpression(newVal)
  }
}, { immediate: true })

// 初始化生成 cron 表達式
generateDailyCron()
</script>

<style scoped>
.cron-editor {
  width: 100%;
}
</style>

父組件調(diào)用:

<CronEditor v-model="time" />

import CronEditor from './CronEditor.vue'

組件調(diào)用會直接回傳cron格式的string類型數(shù)據(jù)。周選擇選擇完畢默認(rèn)為每天。

例如每天的九點:"00 00 09 * * *"

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue中的虛擬dom分享

    Vue中的虛擬dom分享

    虛擬DOM是一種用JavaScript對象來描述真實DOM的技術(shù),通過diff算法實現(xiàn)高效的DOM更新,提高頁面性能,Vue通過render函數(shù)和VNode實現(xiàn)虛擬DOM,結(jié)合diff算法減少DOM操作,提升用戶體驗
    2024-12-12
  • vue+electron實現(xiàn)創(chuàng)建多窗口及窗口間的通信(實施方案)

    vue+electron實現(xiàn)創(chuàng)建多窗口及窗口間的通信(實施方案)

    這篇文章主要介紹了vue+electron實現(xiàn)創(chuàng)建多窗口及窗口間的通信,本文給大家分享實施方案結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 基于Vue實現(xiàn)卡片無限滾動動畫

    基于Vue實現(xiàn)卡片無限滾動動畫

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue制作出卡片無限滾動動畫,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-05-05
  • vue項目中api接口管理總結(jié)

    vue項目中api接口管理總結(jié)

    本篇文章給大家介紹了vue項目中API接口管理的相關(guān)知識點,以及相關(guān)JS代碼分析,有興趣的朋友參考下。
    2018-04-04
  • 從0到1解鎖Element-Plus組件二次封裝El-Dialog動態(tài)調(diào)用的原理解析

    從0到1解鎖Element-Plus組件二次封裝El-Dialog動態(tài)調(diào)用的原理解析

    作者通過二次封裝Element-Plus的el-dialog組件,實現(xiàn)動態(tài)顯示與數(shù)據(jù)傳遞功能,提升項目靈活性和代碼復(fù)用性,適用于用戶編輯、文件上傳確認(rèn)、權(quán)限管理等多場景需求,本文給大家介紹從0到1解鎖Element-Plus組件二次封裝El-Dialog動態(tài)調(diào)用的原理解析,感興趣的朋友一起看看吧
    2025-07-07
  • vue前端代碼如何通過maven打成jar包運行

    vue前端代碼如何通過maven打成jar包運行

    這篇文章主要介紹了vue前端代碼如何通過maven打成jar包運行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • vue 解除鼠標(biāo)的監(jiān)聽事件的方法

    vue 解除鼠標(biāo)的監(jiān)聽事件的方法

    這篇文章主要介紹了vue 解除鼠標(biāo)的監(jiān)聽事件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解決Vue Loading PostCSS Plugin failed:Cannot find module autoprefixer問題

    解決Vue Loading PostCSS Plugin failed:Cann

    這篇文章主要介紹了解決Vue Loading PostCSS Plugin failed:Cannot find module autoprefixer問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue 使用vant插件做tabs切換和無限加載功能的實現(xiàn)

    vue 使用vant插件做tabs切換和無限加載功能的實現(xiàn)

    這篇文章主要介紹了vue 使用vant插件做tabs切換和無限加載功能的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue函數(shù)@click.prevent的使用解析

    vue函數(shù)@click.prevent的使用解析

    這篇文章主要介紹了vue函數(shù)@click.prevent的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

阿尔山市| 南昌市| 灌阳县| 南康市| 金塔县| 汶川县| 汉川市| 射阳县| 砀山县| 乐亭县| 滦南县| 旺苍县| 呈贡县| 黄浦区| 赤峰市| 昌图县| 固原市| 桑植县| 莎车县| 栖霞市| 珠海市| 洛浦县| 乌审旗| 扎兰屯市| 淳化县| 永和县| 清水河县| 长葛市| 乐都县| 衡山县| 石城县| 长顺县| 吉水县| 平谷区| 巫山县| 道真| 卢龙县| 疏附县| 河间市| 塔河县| 唐河县|