【问题标题】:Validation and isValid issues facing with Formik in react jsreact js中Formik面临的验证和isValid问题
【发布时间】:2020-10-06 14:15:30
【问题描述】:
  1. 我在 react js 中使用 formik.. 目前我只是添加了 enableReinitialize 以在状态发生任何变化后更新 initialValues.. 所以这里即使在更正文本之后也会显示验证消息。单击文本框外部后,此验证消息将被删除。我可以在文本框中更正数据后立即隐藏此消息吗?

  2. Dirty 和 isValid 使按钮处于禁用状态,即使没有验证。

Register.JS

        import React, { Component, useState } from 'react';
         import {Formik} from 'formik';
         import validateSignUp from '../../containers/Validations/SignUp/SignUpValidation'
          class Register extends Component {
           constructor(props) {
            super();
            this.state = {
            fields: {CountryCode:'', EmailId:'', Password:''},
             errors: {},
           };
             this.handleChange = this.handleChange.bind(this);
           }
          handleChange(e) {
          let fields = this.state.fields;
          fields[e.target.name] = e.target.value;
          this.setState({
          fields,
         });
         }
          handleSubmit(){
         console.log(this.state.fields);
        }

 render() {

  return (
    <Formik
    enableReinitialize
    initialValues={this.state.fields}
    validate={validateSignUp}
    >
    {({errors, touched, handleBlur, isSubmitting, isValid, dirty}) => (
    <div className='signUp-form form_wrapper'>
      <div className='form-body'>
        <form name='first' onSubmit={this.handleSubmit}>
          <div className='row'></div>
  
                <div className='form-group'>
                  <label>Email address</label>
                  <input type='email' name="EmailId"
                    onChange={this.handleChange} placeholder='abc@example.com'
                    onBlur={handleBlur} value={this.state.fields.EmailId} 
                    className='form-control'/>
                  <div className='info-message'>
                    <div className='errorMsg'>{errors.EmailId && 
                    touched.EmailId && errors.EmailId}</div>
                  </div>
                </div>
  
                <div className='form-group'>
                  <label>Password</label>
                  <input type='password' name="Password"  
                    onChange={this.handleChange} onBlur={handleBlur} value={this.state.fields.Password}
                    className='form-control'/>
                  <div className='info-message'>
                    <div className='errorMsg'>{errors.Password && 
                    touched.Password && errors.Password}</div>
                  </div>
                </div>

          <button type='submit' disabled={!(isValid && dirty)} className='btn btn-danger'>
            continue
          </button>
        </form>
      </div>
    </div>
    )}
    </Formik>
  );


  }
 }

export default Register;

SignUpValidation.JS

const validateSignUp = validate => {
const errors = {};
 if (!validate.EmailId) {
   errors.EmailId = 'Please Enter Email ID';
  } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(validate.EmailId)) {
    errors.EmailId = 'Invalid email address';
  }
   if (!validate.Password) {
   errors.Password = 'Please Enter New Password Which you want to set';
    } else if (!validate.Password.match(/^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.* 
    [@#$%&]).*$/)) {
  errors.Password = 'Password Must contain at least one number and one uppercase and lowercase 
  letter, and at least 8 or more characters';
    }
   return errors;
   };
 export default validateSignUp;

【问题讨论】:

    标签: reactjs formik


    【解决方案1】:

    我认为您应该使用 yup 进行 formik 验证,因为它会自动处理这些情况。

    【讨论】:

    • 我想我 formik 的 formik 手柄工作正常,这个问题只与客户手柄的变化有关。所以即使使用是的,我也是一样的。
    • 不,我使用了Yup,如果输入值正确,错误消息会自动消失。一旦你创建了 yup 模式进行验证,你就可以将它传递给 formik prop validationSchema,所以它的行为会有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2019-12-26
    • 2018-03-21
    相关资源
    最近更新 更多