我所做的是将formik动作发送到saga并根据saga API调用响应处理表单动作。
这是我的formik表单表示组件:
import React from "react";
import { ErrorMessage, Field, Form, Formik } from "formik";
import * as Yup from "yup";
import { Button, Col, FormGroup } from "reactstrap";
const RefundForm = (props) => {
return (
<Formik
initialValues={{
bank: "",
amount: "",
}}
validationSchema={Yup.object({
// availableEmoney: Yup.string().required("Required"),
// availableLimit: Yup.string().required("Required"),
bank: Yup.string().required("Required"),
amount: Yup.string().required("Required"),
})}
onSubmit={props.handleSubmitMethod}
>
{(formikProps) => (
<Form onSubmit={formikProps.handleSubmit}>
<div className="form-row">
<Col lg={8} xl={8}>
<FormGroup>
<label>Bank Name & Account Number</label>
<Field
as="select"
name="bank"
className="form-control"
>
<option value="">Select a bank</option>
{props.banks.map((bank) => {
return (
<option value={bank.id} key={bank.id}>
{`${bank.bank_name} (${bank.bank_account_number})`}
</option>
);
})}
</Field>
<ErrorMessage
name="bank"
component="div"
className="text-danger"
/>
</FormGroup>
</Col>
<Col lg={4} xl={4}>
<FormGroup>
<label>Amount</label>
<Field name="amount" type="text" className="form-control" />
<ErrorMessage
name="amount"
component="div"
className="text-danger"
/>
</FormGroup>
</Col>
</div>
<div className="form-row mt-3 text-right">
<Col>
<Button
className="primary-color"
type="submit"
disabled={!formikProps.dirty || formikProps.isSubmitting}
>
Submit
</Button>
</Col>
</div>
</Form>
)}
</Formik>
);
};
export default RefundForm;
这是我处理 formik 表单提交的函数:
const handleRefundFormSubmit = (values, actions) => {
//values: form values. actions: formikActions
dispatch(
createRefund({
data: {
amount: values.amount,
distributor_bank_id: values.bank,
},
formikActions: actions, // sending formik actions to the saga
})
);
actions.setSubmitting(false);
};
这是我的传奇函数:
function* createNewRefund(action) {
try {
const response = yield call(
postDataWithAuth,
REFUND_CREATE,
action.payload.data
);
yield put(createRefundSuccessful(response.message));
// Call the formik resetForm() function if the response is success so that the
// the form is cleared
yield put(action.payload.formikActions.resetForm());
} catch (error) {
yield put(createRefundFailed(error.response.data));
}
}