【问题标题】:React validation issue for render value渲染值的反应验证问题
【发布时间】:2020-08-09 15:15:31
【问题描述】:

我正在使用 react Yup 验证,但在编辑某些内容时我遇到了验证问题(编辑表单)。即使字段已填充,验证器的行为也会像它们为空一样。我已经记录了状态并且值也出现在那里..相同的代码在没有value={contactPersonName || ""} 参数的情况下工作正常...参考附图

import React from "react";
import { Formik, Field, Form, ErrorMessage } from "formik";
import * as Yup from "yup";
import MaintanaceRequestService from "../../service/tenant/MaintanaceRequestService";
import axios from "axios";
import { CheckSquare } from "react-feather";
import {
  Card,
  CardHeader,
  CardTitle,
  CardBody,
  Button,
  FormGroup,
  Col,
} from "reactstrap";

const formValidation = Yup.object().shape({
  contactPersonName: Yup.string().nullable().required("Required"),
  priority: Yup.number().required("Required"),
  contactPersonEmail: Yup.string()
    .email("Invalid email address")
    .required("Required"),
});

class MaintananceUpdate extends React.Component {
  state = {
    successAlert: true,
  };

  async componentDidMount() {
    let mess = "";
    await axios
      .post("http://localhost:8080/tenant/maint/preEdit/", {
        maintId: "1144",
      })

      .then((response) => {
        console.log(response.data.maintReq);
        mess = response.data.maintReq;

        this.setState({
          updatable: true,
          contactPersonName: mess.contactPersonName,
          contactPersonEmail: mess.contactPersonEmail,
        });
      });
  }

  render() {
    const { contactPersonName, contactPersonEmail } = this.state;

    return (
      <Card>
        <CardHeader>
          <CardTitle>Maintanance Request</CardTitle>
        </CardHeader>
        <CardBody>
          <Formik
            initialValues={{
              contactPersonEmail: "",
              contactPersonName: "",
            }}
            validationSchema={formValidation}
            onSubmit={(values, actions) => {
              values.issueType = values.issueType.value;

              console.log(values.priority);
              setTimeout(() => {
                MaintanaceRequestService.createRequest(values).then(
                  (response) =>
                    this.setState({
                      description: response.data.description,
                    })
                );
                console.log(values);

                this.successMessgae("successAlert", true);
                actions.setSubmitting(false);
              }, 1000);
            }}
          >
            {(props) => {
              const { handleSubmit, setFieldValue, handleBlur } = props;
              return (
                <Form onSubmit={props.handleSubmit}>
                  <FormGroup>
                    <label htmlFor="contactPersonName">Person Name</label>
                    <Field
                      className="form-control"
                      name="contactPersonName"
                      placeholder="Doe"
                      type="text"
                      value={contactPersonName || ""}
                      onChange={(e) =>
                        this.setState({ contactPersonName: e.target.value })
                      }
                      onBlur={handleBlur}
                    />
                    <ErrorMessage
                      name="contactPersonName"
                      component="div"
                      className="field-error text-danger"
                    />
                  </FormGroup>
                  <FormGroup>
                    <label htmlFor="contactPersonEmail">Email</label>
                    <Field
                      className="form-control"
                      name="contactPersonEmail"
                      placeholder="jane@acme.com"
                      type="email"
                      value={contactPersonEmail || ""}
                      onChange={(e) =>
                        this.setState({ contactPersonEmail: e.target.value })
                      }
                      onBlur={handleBlur}
                    />

                    <ErrorMessage
                      name="contactPersonEmail"
                      component="div"
                      className="field-error text-danger"
                    />
                  </FormGroup>

                  <FormGroup row>
                    <Col md={{ size: 8, offset: 4 }}>
                      <Button.Ripple
                        color="primary"
                        type="submit"
                        className="mr-1 mb-1"
                      >
                        <CheckSquare size={14} />
                        <span className="align-middle ml-25">Submit</span>
                      </Button.Ripple>
                    </Col>
                  </FormGroup>
                </Form>
              );
            }}
          </Formik>
        </CardBody>
      </Card>
    );
  }
}
export default MaintananceUpdate;

Image

【问题讨论】:

    标签: reactjs validation formik yup formik-material-ui


    【解决方案1】:

    您正在使用自己的handleChange。所以一旦你在你的handleChange中完成了你的工作,就打电话给formik的handleChange。除非你调用 formik 的 handleChange,否则 formik 不会知道你的 Field

    ...
    const { handleSubmit, setFieldValue, handleBlur, handleChange } = props; // <----------- destructure formik's handleChange
    return (
    <Form onSubmit={props.handleSubmit}>
        <FormGroup>
            <label htmlFor="contactPersonName">Person Name</label>
            <Field
                className="form-control"
                name="contactPersonName"
                placeholder="Doe"
                type="text"
                value={contactPersonName || ""}
                onChange={(e) =>
                {
                    this.setState({ contactPersonName: e.target.value })
                    handleChange(e) // <----------- call formik's handleChange
                }
                }
                onBlur={handleBlur}
            />
    

    【讨论】:

    • 我尝试过使用 formik handlechange,但没有成功,面临同样的问题
    【解决方案2】:

    将 enableReinitialize 添加到 formik 解决了我的问题

    <Formik
              enableReinitialize
              ..
              render={
                ({
                  ..
                }) => ( 
                 //form uses initialValues
              )} />

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-14
      • 2016-07-13
      • 2021-04-13
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多