<Form.Item label="開始時間"> {getFieldDecorator('planStartTime', { rules: [ { validator(_, value, callback) { if (value && form.getFieldValue('planEndTime')) { const endTime = form .getFieldValue('planEndTime') .format( endMode === 'date' ? 'YYYY-MM-DD 23:59:59' : 'YYYY-MM-DD HH:mm:ss' ); const newValue = value.format( startMode === 'date' ? 'YYYY-MM-DD 00:00:00' : 'YYYY-MM-DD HH:mm:ss' ); if (endTime && moment(newValue) > moment(endTime)) { return callback('不可大於截止時間'); } return callback(); } return callback(); } } ], initialValue: getPath(state, 'taskParam.planStartTime') ? moment(getPath(state, 'taskParam.planStartTime')) : null })( <DatePicker style={{ width: '100%' }} showTime placeholder="請輸入開始時間" format={startMode === 'date' ? 'MM-DD' : 'MM-DD HH:mm'} onOk={e => handleTime(e, 'start')} onChange={(e1, e2) => handleTimeChange(e1, e2, 'start')} onPanelChange={(e1, e2) => handleTimePanel(e1, e2, 'start')} /> )} </Form.Item> <Form.Item label="截止時間"> {getFieldDecorator('planEndTime', { rules: [ { required: true, message: '請輸入截止時間' }, { validator(_, value, callback) { if (value && form.getFieldValue('planStartTime')) { const startTime = form .getFieldValue('planStartTime') .format( startMode === 'date' ? 'YYYY-MM-DD 00:00:00' : 'YYYY-MM-DD HH:mm:ss' ); const newValue = value.format( endMode === 'date' ? 'YYYY-MM-DD 23:59:59' : 'YYYY-MM-DD HH:mm:ss' ); if (startTime && moment(newValue) < moment(startTime)) { return callback('不可小於開始時間'); } return callback(); } return callback(); } } ], initialValue: getPath(state, 'taskParam.planEndTime') ? moment(getPath(state, 'taskParam.planEndTime')) : null })( <DatePicker style={{ width: '100%' }} showTime placeholder="請輸入截止時間" format={endMode === 'date' ? 'MM-DD' : 'MM-DD HH:mm'} onOk={e => handleTime(e, 'end')} onChange={(e1, e2) => handleTimeChange(e1, e2, 'end')} onPanelChange={(e1, e2) => handleTimePanel(e1, e2, 'end')} /> )} </Form.Item>
↑表單項內判斷開始時間是否小於結束時間
↓兩個日期表單項需要有兩種展示方式【當用戶只選擇到日期-展示日期;當用戶選擇到時間-展示時間】
const handleTime = (value, type) => { if (type === 'start') { setStartDate(value.format(startMode === 'date' ? 'YYYY-MM-DD 00:00:00' : 'YYYY-MM-DD HH:mm:ss')); } else { setEndDate(value.format(endMode === 'date' ? 'YYYY-MM-DD 23:59:59' : 'YYYY-MM-DD HH:mm:ss')); } }; const handleTimePanel = (value, mode, type) => { if (type === 'start') { setStartMode(mode); } else { setEndMode(mode); } }; const handleTimeChange = (date, dateString, type) => { if (!dateString) { if (type === 'start') { setStartDate(''); } else { setEndDate(''); } } };
↓相關hooks
const [startMode, setStartMode] = useState( getPath(state, 'taskParam.planStartTime') && getPath(state, 'taskParam.planStartTime').indexOf('00:00:00') === -1 ? 'time' : 'date' ); const [endMode, setEndMode] = useState( getPath(state, 'taskParam.planEndTime') && getPath(state, 'taskParam.planEndTime').indexOf('23:59:59') === -1 ? 'time' : 'date' ); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState('');
↓提交表單時param修改
const params = { ...values, id: 0, planStartTime: startDate || (values.planStartTime && values.planStartTime.format( startMode === 'date' ? 'YYYY-MM-DD 00:00:00' : 'YYYY-MM-DD HH:mm:ss' )) || '', planEndTime: endDate || (values.planEndTime && values.planEndTime.format( endMode === 'date' ? 'YYYY-MM-DD 23:59:59' : 'YYYY-MM-DD HH:mm:ss' )) || '' };