vue3的定時器cron組件詳解
更新時間:2025年10月25日 11:33:28 作者:不想長胖的可樂鴨
該文章介紹了如何在Vue3和Antd-Vue中實現(xiàn)一個定時任務調(diào)度組件,該組件支持每日定時任務,并返回cron格式的字符串,父組件調(diào)用該組件后,會得到一個cron格式的時間字符串,表示任務的執(zhí)行時間,例如,“000009***”表示每天的9點
先看圖
僅適用于vue3+antd-vue,僅對業(yè)務需求,每日定時。
實現(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]) // 默認周一
// 每周推送的時間
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: '周日' }
]
// 當類型改變時重置時間
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
// 解構出秒字段,但我們在解析時忽略它
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ù)。周選擇選擇完畢默認為每天。
例如每天的九點:"00 00 09 * * *"
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue+electron實現(xiàn)創(chuàng)建多窗口及窗口間的通信(實施方案)
這篇文章主要介紹了vue+electron實現(xiàn)創(chuàng)建多窗口及窗口間的通信,本文給大家分享實施方案結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-09-09
從0到1解鎖Element-Plus組件二次封裝El-Dialog動態(tài)調(diào)用的原理解析
作者通過二次封裝Element-Plus的el-dialog組件,實現(xiàn)動態(tài)顯示與數(shù)據(jù)傳遞功能,提升項目靈活性和代碼復用性,適用于用戶編輯、文件上傳確認、權限管理等多場景需求,本文給大家介紹從0到1解鎖Element-Plus組件二次封裝El-Dialog動態(tài)調(diào)用的原理解析,感興趣的朋友一起看看吧2025-07-07
解決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),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

