更改上下文时如何立即更新错误值

Posted

技术标签:

【中文标题】更改上下文时如何立即更新错误值【英文标题】:How update errors value immediately when I am changing Context 【发布时间】:2021-12-25 00:57:02 【问题描述】:

我有使用 Formik 和 Yup 创建的联系表。此外,在我的应用程序中,我使用 Context 来更改语言。问题是当我对某些输入字段有错误然后我使用上下文更改语言时。错误语言不会立即更新,但只有在我对输入进行一些操作时才会更新。如何解决?

function ContactForm() 

  const [lang] = useContext(LangContext);

  const initialValues =  email: '', name: '', message: '' ;
  const contactSchema = Yup.object().shape(
    email: Yup.string()
      .email(lang.contact.writeMe.emailIncorrect)
      .required(lang.contact.writeMe.emailError),
    name: Yup.string()
      .required(lang.contact.writeMe.nameError),
    message: Yup.string()
      .required(lang.contact.writeMe.messageError),
  );

  return (
    <section id="contact" className="bg-dark ">
      <div className="container">
        <div className="wrapper">
          <div className="row no-gutters">
            <div className="col-md-6 d-flex align-items-stretch">
              <div className="contact-wrap w-100 p-md-5 p-4 py-5">
                <Formik
                  initialValues=initialValues
                  validationSchema=contactSchema
                  onSubmit=(values,  setSubmitting, resetForm ) => 
                    const timeOut = setTimeout(() => 
                      setSubmitting(false);
                      clearTimeout(timeOut);
                    , 1500);
                    sendEmail(values, resetForm);
                  
                >
                  (
                    values,
                    errors,
                    touched,
                    handleChange,
                    handleBlur,
                    handleSubmit,
                    isSubmitting,
                  ) => 
                    return (
                      <form method="POST" id="contactForm" name="contactForm" className="contactForm" noValidate="novalidate" onSubmit=handleSubmit >
                        <h3 className="mb-4">lang.contact.writeMe.title</h3>
                        isFormSended
                          ? (isSubmitting
                            ? <div id="form-message-primary" className="mb-4">lang.contact.writeMe.subtitleSending</div>
                            : (isError
                              ? <div id="form-message-danger" className="mb-4 text-danger">lang.contact.writeMe.subtitleError</div>
                              : <div id="form-message-primary" className="mb-4">lang.contact.writeMe.subtitleSuccess</div>))
                          : <div id="form-message-danger" className="mb-4">lang.contact.writeMe.subtitle</div>
                        <div className="row">
                          <div className="col-md-12 mb-1">
                            <div className="form-group">
                              <input
                                type="email"
                                className=`form-control $touched.email ? (errors.email ? 'incorrect' : 'correct') : ''`
                                name="email"
                                id="email"
                                placeholder=lang.contact.writeMe.emailInput
                                onChange=handleChange
                                onBlur=handleBlur
                                value=values.email
                              />
                              <p className="text-danger">errors.email && touched.email && errors.email</p>
                            </div>
                          </div>
                          <div className="col-md-12 mb-1">
                            <div className="form-group">
                              <input
                                type="text"
                                autoComplete="new-password"
                                className=`form-control $touched.name ? (errors.name ? 'incorrect' : 'correct') : ''`
                                name="name"
                                id="name"
                                placeholder=lang.contact.writeMe.nameInput
                                onChange=handleChange
                                onBlur=handleBlur
                                value=values.name
                              />
                              <p className="text-danger">errors.name && touched.name && errors.name</p>
                            </div>
                          </div>
                          <div className="col-md-12 mb-1">
                            <div className="form-group">
                              <textarea
                                name="message"
                                className=`form-control $touched.message ? (errors.message ? 'incorrect' : 'correct') : ''`
                                id="message"
                                cols="30"
                                rows="6"
                                placeholder=lang.contact.writeMe.messageInput
                                onChange=handleChange
                                onBlur=handleBlur
                                value=values.message
                              ></textarea>
                              <p className="text-danger">errors.message && touched.message && errors.message</p>
                            </div>
                          </div>
                          <div className="col-md-12">
                            <div className="form-group">
                              <button type="submit" className="btn btn-primary" disabled=isSubmitting>lang.contact.writeMe.buttonMessage</button>
                              <div className="submitting"></div>
                            </div>
                          </div>
                        </div>
                      </form>
                    );
                  
                </Formik>
(...)
  );

【问题讨论】:

【参考方案1】:

要支持多语言验证yup 消息,您可以使用setLocale,如此处所述https://github.com/jquense/yup#using-a-custom-locale-dictionary。像这样:

setLocale(
  email: 
    required: 'Required email',
  ,
);

【讨论】:

【参考方案2】:

对于多语言,您应该使用 react-localization。有关更多信息,请单击下面的链接。 https://www.npmjs.com/package/react-localization

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于更改上下文时如何立即更新错误值的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:SQLite 没有立即更新

代码优先更新数据库错误“ApplicationDbContext”上下文已更改

使用 setState 时如何立即获取更新状态?

挂钩更改状态不会更新上下文提供者的值?

在上下文中丢弃模型的更改

打开 WatchOS2 时获取更新的应用程序上下文