zent
Version:
一套前端设计语言和基于React的实现
115 lines (101 loc) • 2.91 kB
JavaScript
import isPromise from 'utils/isPromise';
import map from 'lodash/map';
import SubmissionError from './SubmissionError';
const handleSubmit = (submit, zentForm) => {
const props = zentForm.props;
const values = zentForm.getFormValues();
const { onSubmitSuccess, onSubmitFail } = props;
let validationErrors;
zentForm.setFormDirty(true);
// 如果有异步校验未完成,阻止表单提交
if (zentForm.isValidating()) {
if (onSubmitFail) {
onSubmitFail(
new SubmissionError({
isValidating: true
})
);
}
return;
}
if (!zentForm.isValid()) {
// 存在校验错误
validationErrors = zentForm.getValidationErrors();
if (onSubmitFail) {
onSubmitFail(new SubmissionError(validationErrors));
}
} else {
const handleSubmitError = submitError => {
// 只处理SubmissionError类型的错误
const error =
submitError instanceof SubmissionError ? submitError.errors : undefined;
if (onSubmitFail) {
onSubmitFail(error);
}
return error;
};
const doSubmit = () => {
let result;
try {
// 传入zentForm是为了使用服务端校验时可以调用setFieldExternalErrors方法
result = submit(values, zentForm);
} catch (submitError) {
const error = handleSubmitError(submitError);
if (error || onSubmitFail) {
return error;
}
// 没有处理过的error才throw
throw submitError;
}
if (isPromise(result)) {
zentForm.setState({
isSubmitting: true
});
return result.then(
submitResult => {
zentForm.setState({
isSubmitting: false
});
if (onSubmitSuccess) {
onSubmitSuccess(submitResult);
}
return submitResult;
},
submitError => {
zentForm.setState({
isSubmitting: false
});
const error = handleSubmitError(submitError);
if (error || onSubmitFail) {
return error;
}
throw submitError;
}
);
}
// submit是一个同步过程,直接当成功处理
if (onSubmitSuccess) {
onSubmitSuccess(result);
}
return result;
};
// 存在没有进行过的异步校验
if (!zentForm.isFormAsyncValidated()) {
const asyncValidations = map(zentForm.fields, field => {
return zentForm.asyncValidate(field, field.getValue());
});
Promise.all(asyncValidations)
.then(() => {
return doSubmit();
})
.catch(error => {
if (onSubmitFail) {
onSubmitFail(new SubmissionError(error));
}
});
} else {
return doSubmit();
}
}
};
export default handleSubmit;