javascript - 如何仅在触摸 Field 时显示错误? | react && 福尔米克

标签 javascript reactjs forms validation formik

我有一个用 React 和 Formik 制作的表单。一切正常,除了一种极端情况。我需要隐藏电子邮件输入的错误消息(关于错误的电子邮件地址),因为它不是必需的,因为它没有被触摸。

问题: 用户认为电子邮件是必需的,即使这是一个完全不相关的错误。

我已经尝试在条件渲染中设置要触摸的字段,因此,只有在触摸该字段时才会出现错误。如下所示:

const emailValidation = (value, field) => {
  let emailErrorMessage;
  if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value) && field.email.touched) {
    emailErrorMessage = 'Invalid email address';
  }
  return emailErrorMessage;
};

那是行不通的。我在代码的 JSX 部分也将其设置为 touched 。 见下文:

const createUserValidationSchema = Yup.object().shape({
  username: Yup.string('Provide a Username').required('Username is Required'),
  email: Yup.string('Provide an email'),
  password: Yup.string('Enter your password').required('Password is Required'),
  confirmPassword: Yup.string('Enter your password again')
    .required('Password Confirmation is Required')
    .oneOf([Yup.ref('password')], 'Passwords do not match')
});

const emailValidation = (value, field) => {
  let emailErrorMessage;
  if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value) && field.email.touched) {
    emailErrorMessage = 'Invalid email address';
  }
  return emailErrorMessage;
};

class userValidation extends Component {
  static propTypes = {
    ...formPropTypes,
    username: PropTypes.string,
    email: PropTypes.string,
    password: PropTypes.string,
    confirmPassword: PropTypes.string,
    groupSelect: PropTypes.func
  };

  static defaultProps = {
    email: ''
  };

  state = {
    type: 'password',
  };

 render() {
    const { type } = this.state;
    return (
      <div className="col-8">
        <h3>Create User</h3>
        <Formik
          initialValues={{
            username: '',
            email: '',
            password: '',
            confirmPassword: ''
          }}
          validationSchema={createUserValidationSchema}
          onSubmit={values => {
            // same shape as initial values
            console.log(values);
          }}
        >
          {({ errors, touched }) => (
            <Form>
              <div className="my-3">
                <label>
                  Username <span className="text-danger">*</span>
                </label>
                <Field name="username" type="text" className="form-control rounded-0" />
                {errors.username && touched.username ? (
                  <div className="text-danger">{errors.username}</div>
                ) : null}
              </div>
              <div className="my-3">
                <label>email</label>
                <Field
                  name="email"
                  validate={emailValidation}
                  type="email"
                  className="form-control rounded-0"
                />
                {errors.email && touched.email ? (
                  <div className="text-danger">{errors.email}</div>
                ) : null}
              </div>
              <div className="my-3">
                <label>
                  Password <span className="text-danger">*</span>
                </label>
                <div className="d-flex align-items-center">
                  <Field type={type} name="password" className="form-control rounded-0 mr-2" />
                  <span
                    className={type === 'password' ? 'fa fa-eye fa-lg' : 'fa fa-eye-slash fa-lg'}
                    onClick={this.togglePasswordMask}
                  />
                </div>
                {errors.password && touched.password ? (
                  <div className="text-danger">{errors.password}</div>
                ) : null}
              </div>
              <div className="my-3">
                <label>
                  Confirm Password <span className="text-danger">*</span>
                </label>
                <Field name="confirmPassword" type={type} className="form-control rounded-0" />
                {errors.confirmPassword && touched.confirmPassword ? (
                  <div className="text-danger">{errors.confirmPassword}</div>
                ) : null}
              </div>
              <button type="submit" className="btn btn-primary rounded-0 float-right my-3">
                Create User
              </button>
            </Form>
          )}
        </Formik>
      </div>
    );
  }
}

export default userValidation;

预期结果: 仅在触摸该字段时显示 无效电子邮件 地址。如果我尝试提交但没有提供电子邮件地址,则不应出现该错误。

当前结果: 出现错误,不让我提交。

最佳答案

你只能用 yup 来做。您不需要额外的自定义验证

const createUserValidationSchema = Yup.object().shape({
  email: Yup.string().email('Provide an email'),
  ....
});

是的,当电子邮件填写时验证它并允许提交带有空电子邮件字段的表单

关于javascript - 如何仅在触摸 Field 时显示错误? | react && 福尔米克,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54553239/

相关文章:

javascript - 如何对数组中的项目进行减去

reactjs - 如何在 NextJS 配置文件中组合多个加载器(CSS、LESS、ttf 等)?

reactjs - Material UI - 自动完成样式

php - Symfony 2 FOSUserBundle : Override form without defining service

HTML:防止 POST 表单的 url 编码

javascript - 意外 token node.js v8.9.4

javascript - 与初始函数调用之前/之后相比,将函数作为参数运行有什么实际应用?

javascript - 我试图将我的函数调用存储在一个对象中

reactjs - React - 将 child 分成几部分

javascript - 使用纯 JavaScript 克隆字段集并更改 ID?