import React, { useEffect, useState } from 'react' import { Tabs, Label } from './components' import { Second, Minute, Hour, Day, Month, Week, Year } from './panel'; import type { CronEditorProps } from './interface' import './CronEditor.css' const DEFAULT_CRON = '* * * * * ?'; export default function CronEditor({ value, onChange, style }: CronEditorProps) { const [ready, setReady] = useState(false); const [cronArr, setCronArr] = useState(DEFAULT_CRON.split(' ')); const [tab, setTab] = useState('second'); useEffect(() => { // console.log('value.change', value) if (value === undefined || value.trim() === '') { if (!ready) setReady(true); return; } handleChangeCron(value) if (!ready) setReady(true); }, [value]) useEffect(() => { // console.log('cronArr.change', cronArr) const newCron = cronArr.join(' ').trim() if (onChange && newCron !== value) { if (ready) onChange(newCron) } }, [cronArr]) function handleChangeCronArr(index: number, newValue: string) { // console.log('handleChangeCronArr', index, newValue) const newArr = [ ...cronArr ]; newArr[index] = newValue; if (newArr.toString() !== cronArr.toString()) { setCronArr(newArr); } } function handleChangeCron(v:string) { const newArr = v.trim().split(' ') if (newArr.length < 6) { for (let i = newArr.length; i < 6; i+=1) { newArr.push(i === 5 ? '?' : '*') } } // 比较两个数组是否一致 if (newArr.toString() !== cronArr.toString()) { setCronArr(newArr); } } // console.log('CronEditor', cronArr) const cron = cronArr.join(' ').trim() return (
handleChangeCronArr(0, v)} visible={tab === 'second'} /> handleChangeCronArr(1, v)} visible={tab === 'minute'} /> handleChangeCronArr(2, v)} visible={tab === 'hour' } /> handleChangeCronArr(3, v)} visible={tab === 'day' } /> handleChangeCronArr(4, v)} visible={tab === 'month' } /> handleChangeCronArr(5, v)} visible={tab === 'week' } /> handleChangeCronArr(6, v)} visible={tab === 'year' } />
表达式字段
Cron表达式
handleChangeCron(e.target.value)} style={{ flex: 1 }} />
) };