formik表单提交后如何清除react-select值?

时间:2021-03-16 13:16:04

标签: javascript reactjs formik react-select

我有一个 formik 表单,我在其中使用 react-select 作为选择列表。这是我的表格:

import React from "react";

import { ErrorMessage, Field, Form, Formik } from "formik";
import * as Yup from "yup";
import { Button, Col, FormGroup } from "reactstrap";
import Select from "react-select";


const AddBankForm = (props) => {
  return (
    <Formik
      initialValues={{
        district: props.districts,
      }}
      validationSchema={Yup.object({
        district: Yup.string().required("Required"),
      })}
      onSubmit={(values, actions) => {
    setError(null);
    setMessage(null);
    try {
      const response = await postDataWithAuth(DISTRIBUTOR_BANK_ADD, {
        routing_number: values.branch,
        bank_account_number: values.accountNumber,
        account_holder_name: values.accountName,
        pin_number: values.tpin,
      });


      // This is not working
      actions.resetForm();

      
      setMessage(response.message);
    } catch (e) {
      setError(e.response.data);
    }
    actions.setSubmitting(false);
  }}
    >
      {(formikProps) => (
        <Form onSubmit={formikProps.handleSubmit} autoComplete="one-time-code">
          <div className="form-row">
            <Col>
              <FormGroup>
                <label>
                  District<span className="text-danger">*</span>
                </label>
                <Select
                  menuPortalTarget={document.body}
                  type="text"
                  name="district"
                  onChange={(option) => {
                    props.updateDistrict(option.value);
                    formikProps.setFieldValue("district", option.value);
                  }}
                  options={
                    props.isCreateLiftingSuccessful ? [] : props.districts
                  }
                  onBlur={formikProps.handleBlur}
                />
                <ErrorMessage
                  name="district"
                  component="div"
                  className="text-danger"
                />
              </FormGroup>
            </Col>
  </div>
          <div className="form-row mt-3 text-center">
            <Col>
              <Button
                className="btn btn-success"
                type="submit"
                disabled={!formikProps.dirty || formikProps.isSubmitting}
              >
                Submit
              </Button>
            </Col>
          </div>
        </Form>
      )}
    </Formik>
  );
};

问题是在表单提交后,react-select 字段没有被清除。我使用了 formik 的 resetForm() 方法来清除我的表单。不过貌似resetForm方法对react-select字段没有任何影响。

1 个答案:

答案 0 :(得分:0)

您可以使用 'ref' 道具来清除 react-select 字段。

import React from "react";

import { ErrorMessage, Field, Form, Formik } from "formik";
import * as Yup from "yup";
import { Button, Col, FormGroup } from "reactstrap";
import Select from "react-select";


const AddBankForm = (props) => {
  // update start 
  let selectRef = null;
  const clearValue = () => {
    selectRef.select.clearValue();
  };
  // update end
  return (
    <Formik
      initialValues={{
        district: props.districts,
      }}
      validationSchema={Yup.object({
        district: Yup.string().required("Required"),
      })}
      onSubmit={(values, actions) => {
    setError(null);
    setMessage(null);
    try {
      const response = await postDataWithAuth(DISTRIBUTOR_BANK_ADD, {
        routing_number: values.branch,
        bank_account_number: values.accountNumber,
        account_holder_name: values.accountName,
        pin_number: values.tpin,
      });


      // This is not working
      actions.resetForm();
      
      // Try this way
      clearValue();

      
      setMessage(response.message);
    } catch (e) {
      setError(e.response.data);
    }
    actions.setSubmitting(false);
  }}
    >
      {(formikProps) => (
        <Form onSubmit={formikProps.handleSubmit} autoComplete="one-time-code">
          <div className="form-row">
            <Col>
              <FormGroup>
                <label>
                  District<span className="text-danger">*</span>
                </label>
                <Select
                  // use ref
                  ref={ref => {
                    selectRef = ref;
                  }}
                  menuPortalTarget={document.body}
                  type="text"
                  name="district"
                  onChange={(option) => {
                    props.updateDistrict(option.value);
                    formikProps.setFieldValue("district", option.value);
                  }}
                  options={
                    props.isCreateLiftingSuccessful ? [] : props.districts
                  }
                  onBlur={formikProps.handleBlur}
                />
                <ErrorMessage
                  name="district"
                  component="div"
                  className="text-danger"
                />
              </FormGroup>
            </Col>
  </div>
          <div className="form-row mt-3 text-center">
            <Col>
              <Button
                className="btn btn-success"
                type="submit"
                disabled={!formikProps.dirty || formikProps.isSubmitting}
              >
                Submit
              </Button>
            </Col>
          </div>
        </Form>
      )}
    </Formik>
  );
};