【问题标题】:error message without submitting the form没有提交表单的错误消息
【发布时间】:2021-08-25 19:50:23
【问题描述】:

我正在使用 yup 进行验证,一切正常。所以是这样的:

    const HISTORY = useHistory();
    
      const [inputs, setInputs] = useState({
        Name: "",
        Surname: "",
      });
    
      const handleChange = (inputName) => (e) => {
        e.preventDefault();
    
        setInputs({
          ...inputs,
          [inputName]: e.target.value,
        });
      };
    
      const Continue = async (e) => {
        e.preventDefault();
        let formData = {
          Name: inputs.Name,
          Surname: inputs.Surname,
        };
    
        const isValid = await orderFormValidation.isValid(formData);
        if(isValid) {
          HISTORY.push({ pathname: "/checkout", state: inputs });
        }
      };
    
      return (
        <Form className="instantquote p-3 mb-5">
          <Form.Group controlId="formGroupFrom">
            <Form.Label className="form-subtitle">Name</Form.Label>
            <Form.Control
              type="text"
              placeholder="Name"
              name="Name"
              onChange={handleChange("Name")}
              defaultValue={inputs.Name}
            />
            {/* TODO: ERROR MESSAGE */}
          </Form.Group>
          

<Form.Group controlId="formGroupFrom">
            <Form.Label className="form-subtitle">Surname</Form.Label>
            <Form.Control
              type="text"
              placeholder="Surname"
              name="Surname"
              onChange={handleChange("Surname")}
              defaultValue={inputs.Surname}
            />
            {/* TODO: ERROR MESSAGE */}
          </Form.Group>
          <button className="btn button" onClick={Continue}>
            Details
            <BsArrowRightShort />
          </button>
        </Form>
      );

所以基本上,isValid 是正确的。因此,例如,如果其中一个字段为空,它会返回 false,并且不会转到下一个页面,在我们的例子中是结帐页面。所以我的问题是我想给出一条错误消息,但我不知道该怎么做,因为我没有提交表单。这也是我的验证:

export const orderFormValidation = yup.object().shape({
  Name: yup
    .string()
    .min(3, "Too Short!")
    .max(5, "Too Long!")
    .required("Name Required"),
Surname: yup
    .string()
    .min(3, "Too Short!")
    .max(5, "Too Long!")
    .required("Surname Required"),
});

【问题讨论】:

    标签: reactjs validation yup


    【解决方案1】:

    您可以添加状态以接受这样的错误消息:

     const HISTORY = useHistory();
    
      const [inputs, setInputs] = useState({
        Name: "",
        Surname: "",
      });
      const [name, setName] = useState("");
      const [surName, setSurName] = useState("");
      const handleChange = (inputName) => (e) => {
        e.preventDefault();
    
        setInputs({
          ...inputs,
          [inputName]: e.target.value,
        });
      };
      const nameValidation = yup.object().shape({
        Name: yup
          .string()
          .required("Name Required")
          .min(3, "Too Short!")
          .max(5, "Too Long!"),
      });
      const surNameValidation = yup.object().shape({
        Surname: yup
          .string()
          .required("Surname Required")
          .min(3, "Too Short!")
          .max(5, "Too Long!"),
      });
      const Continue = async (e) => {
        e.preventDefault();
        let formData = {
          Name: inputs.Name,
          Surname: inputs.Surname,
        };
        const isValidSurName = await surNameValidation.isValid(formData);
        const isValidName = await nameValidation.isValid(formData);
        if (isValidName) {
          setName("");
        } else {
          nameValidation.validate(formData).catch((ex) => {
            setName(ex.message);
          });
        }
        if (isValidSurName) {
          setSurName("");
        } else {
          surNameValidation.validate(formData).catch((ex) => {
            setSurName(ex.message);
          });
        }
        if (isValidName && isValidSurName) {
          HISTORY.push({ pathname: "/checkout", state: inputs });
        }
      };
    
      return (
        <Form className="instantquote p-3 mb-5">
          <Form.Group controlId="formGroupFrom">
            <Form.Label className="form-subtitle">Name</Form.Label>
            <Form.Control
              type="text"
              placeholder="Name"
              name="Name"
              onChange={handleChange("Name")}
              defaultValue={inputs.Name}
            />
            <p>{name}</p>
          </Form.Group>
    
          <Form.Group controlId="formGroupFrom">
            <Form.Label className="form-subtitle">Surname</Form.Label>
            <Form.Control
              type="text"
              placeholder="Surname"
              name="Surname"
              onChange={handleChange("Surname")}
              defaultValue={inputs.Surname}
            />
            <p>{surName}</p>
          </Form.Group>
          <button className="btn button" onClick={Continue}>
            Details
          </button>
        </Form>
      );
    

    如果您有更多字段,则应将验证提取到新组件中

    【讨论】:

    • 谢谢,但实际上我实际上有更多的输入字段。所以我不确定这是否适用于我的情况。抱歉,我应该在我的问题中提到这一点
    • 您可以使用所有输入的对象状态使其像这样,或者我不明白您的问题
    • 我刚刚编辑了我的问题。所以基本上,我需要在它写 TODO: ERROR MESSAGE 的地方出现一条错误消息。例如,我想为名称显示“必填”。
    • 所以我没有收到错误消息,因为我不知道该怎么做。这实际上是我的问题:)
    • 我不明白我想:(如果你编辑你上面的答案可以吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2011-04-12
    • 1970-01-01
    • 2022-11-18
    • 2021-07-13
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多