Reactjs – Validatie van formulierinvoer

Mijn contactpagina is als volgt,

<form name="contactform" onSubmit={this.contactSubmit.bind(this)}>
  <div className="col-md-6">
    <fieldset>
      <input ref="name" type="text" size="30" placeholder="Name"/>
      <br/>
      <input refs="email" type="text" size="30" placeholder="Email"/>
      <br/>
      <input refs="phone" type="text" size="30" placeholder="Phone"/>
      <br/>
      <input refs="address" type="text" size="30" placeholder="Address"/>
      <br/>
    </fieldset>
  </div>
  <div className="col-md-6">
    <fieldset>
      <textarea refs="message" cols="40" rows="20"
                className="comments" placeholder="Message"/>
    </fieldset>
  </div>
  <div className="col-md-12">
    <fieldset>
      <button className="btn btn-lg pro" id="submit"
              value="Submit">Send Message</button>
    </fieldset>
  </div>
</form>

Moet validatie toevoegen voor alle velden. Kan iemand me helpen om validatie toe te voegen in dit reactieformulier?


Antwoord 1, autoriteit 100%

Je moet het gebruik van referenties vermijden, je kunt dit doen met de functie onChange.

Update bij elke wijziging de status van het gewijzigde veld.

Dan kun je eenvoudig controleren of dat veld leeg is of wat je maar wilt.

Je zou iets als volgt kunnen doen:

   class Test extends React.Component {
        constructor(props){
           super(props);
           this.state = {
               fields: {},
               errors: {}
           }
        }
        handleValidation(){
            let fields = this.state.fields;
            let errors = {};
            let formIsValid = true;
            //Name
            if(!fields["name"]){
               formIsValid = false;
               errors["name"] = "Cannot be empty";
            }
            if(typeof fields["name"] !== "undefined"){
               if(!fields["name"].match(/^[a-zA-Z]+$/)){
                  formIsValid = false;
                  errors["name"] = "Only letters";
               }        
            }
            //Email
            if(!fields["email"]){
               formIsValid = false;
               errors["email"] = "Cannot be empty";
            }
            if(typeof fields["email"] !== "undefined"){
               let lastAtPos = fields["email"].lastIndexOf('@');
               let lastDotPos = fields["email"].lastIndexOf('.');
               if (!(lastAtPos < lastDotPos && lastAtPos > 0 && fields["email"].indexOf('@@') == -1 && lastDotPos > 2 && (fields["email"].length - lastDotPos) > 2)) {
                  formIsValid = false;
                  errors["email"] = "Email is not valid";
                }
           }  
           this.setState({errors: errors});
           return formIsValid;
       }
       contactSubmit(e){
            e.preventDefault();
            if(this.handleValidation()){
               alert("Form submitted");
            }else{
               alert("Form has errors.")
            }
        }
        handleChange(field, e){         
            let fields = this.state.fields;
            fields[field] = e.target.value;        
            this.setState({fields});
        }
        render(){
            return (
                <div>           
                   <form name="contactform" className="contactform" onSubmit= {this.contactSubmit.bind(this)}>
                        <div className="col-md-6">
                          <fieldset>
                               <input ref="name" type="text" size="30" placeholder="Name" onChange={this.handleChange.bind(this, "name")} value={this.state.fields["name"]}/>
                               <span style={{color: "red"}}>{this.state.errors["name"]}</span>
                              <br/>
                             <input refs="email" type="text" size="30" placeholder="Email" onChange={this.handleChange.bind(this, "email")} value={this.state.fields["email"]}/>
                             <span style={{color: "red"}}>{this.state.errors["email"]}</span>
                             <br/>
                             <input refs="phone" type="text" size="30" placeholder="Phone" onChange={this.handleChange.bind(this, "phone")} value={this.state.fields["phone"]}/>
                             <br/>
                             <input refs="address" type="text" size="30" placeholder="Address" onChange={this.handleChange.bind(this, "address")} value={this.state.fields["address"]}/>
                             <br/>
                         </fieldset>
                      </div>
                  </form>
                </div>
          )
        }
    }
    React.render(<Test />, document.getElementById('container'));

In dit voorbeeld heb ik de validatie alleen gedaan voor e-mail en naam, maar je hebt een idee hoe je dit moet doen. Voor de rest kun je het zelf doen.

Er is misschien een betere manier, maar je snapt het idee.

Hier is viool.

Hopelijk helpt dit.


Antwoord 2, autoriteit 6%

Ik heb je code overgenomen en aangepast met bibliotheek react-form-with-constraints : https://codepen.io/tkrotoff/pen/LLraZp

const {
  FormWithConstraints,
  FieldFeedbacks,
  FieldFeedback
} = ReactFormWithConstraints;
class Form extends React.Component {
  handleChange = e => {
    this.form.validateFields(e.target);
  }
  contactSubmit = e => {
    e.preventDefault();
    this.form.validateFields();
    if (!this.form.isValid()) {
      console.log('form is invalid: do not submit');
    } else {
      console.log('form is valid: submit');
    }
  }
  render() {
    return (
      <FormWithConstraints
        ref={form => this.form = form}
        onSubmit={this.contactSubmit}
        noValidate>
        <div className="col-md-6">
          <input name="name" size="30" placeholder="Name"
                 required onChange={this.handleChange}
                 className="form-control" />
          <FieldFeedbacks for="name">
            <FieldFeedback when="*" />
          </FieldFeedbacks>
          <input type="email" name="email" size="30" placeholder="Email"
                 required onChange={this.handleChange}
                 className="form-control" />
          <FieldFeedbacks for="email">
            <FieldFeedback when="*" />
          </FieldFeedbacks>
          <input name="phone" size="30" placeholder="Phone"
                 required onChange={this.handleChange}
                 className="form-control" />
          <FieldFeedbacks for="phone">
            <FieldFeedback when="*" />
          </FieldFeedbacks>
          <input name="address" size="30" placeholder="Address"
                 required onChange={this.handleChange}
                 className="form-control" />
          <FieldFeedbacks for="address">
            <FieldFeedback when="*" />
          </FieldFeedbacks>
        </div>
        <div className="col-md-6">
          <textarea name="comments" cols="40" rows="20" placeholder="Message"
                    required minLength={5} maxLength={50}
                    onChange={this.handleChange}
                    className="form-control" />
          <FieldFeedbacks for="comments">
            <FieldFeedback when="*" />
          </FieldFeedbacks>
        </div>
        <div className="col-md-12">
          <button className="btn btn-lg btn-primary">Send Message</button>
        </div>
      </FormWithConstraints>
    );
  }
}

Schermafbeelding:

formulier validatie screenshot

Dit is een snelle hack. Kijk voor een goede demo op https://github.com/tkrotoff/react-form -with-constraints#examples


Antwoord 3, autoriteit 3%

import React from 'react';
import {sendFormData} from '../services/';
class Signup extends React.Component{
  constructor(props){
    super(props);
     this.state = {
       isDisabled:true
     }                                                                                                 
     this.submitForm = this.submitForm.bind(this);
  }
  validateEmail(email){
   const pattern = /[a-zA-Z0-9]+[\.]?([a-zA-Z0-9]+)?[\@][a-z]{3,9}[\.][a-z]{2,5}/g;
   const result = pattern.test(email);
   if(result===true){
     this.setState({
       emailError:false,
       email:email
     })
   } else{
     this.setState({
       emailError:true
     })
   }
 }
 handleChange(e){
  const target = e.target;
  const value = target.type === 'checkbox' ? target.checked : target.value;
  const name = target.name;
  this.setState({
    [name]: value
  });
  if(e.target.name==='firstname'){
    if(e.target.value==='' || e.target.value===null ){
      this.setState({
        firstnameError:true
      })
    } else {
      this.setState({
        firstnameError:false,     
        firstName:e.target.value
      })
    }
  }
  if(e.target.name==='lastname'){
    if(e.target.value==='' || e.target.value===null){
      this.setState({
        lastnameError:true
      })
    } else {
      this.setState({
        lastnameError:false,
        lastName:e.target.value
      })
    }
  }
  if(e.target.name==='email'){
   this.validateEmail(e.target.value);
  }
  if(e.target.name==='password'){
    if(e.target.value==='' || e.target.value===null){
      this.setState({
        passwordError:true
      })
    } else {
      this.setState({
        passwordError:false,
        password:e.target.value
      })
    }
 }
 if(this.state.firstnameError===false && this.state.lastnameError===false && 
  this.state.emailError===false && this.state.passwordError===false){
    this.setState({
      isDisabled:false
    })
 }
}
submitForm(e){
  e.preventDefault();
  const data = {
   firstName: this.state.firstName,
   lastName: this.state.lastName,
   email: this.state.email,
   password: this.state.password
  }
  sendFormData(data).then(res=>{
    if(res.status===200){
      alert(res.data);
      this.props.history.push('/');
    }else{
    } 
  });
 }
render(){
return(
  <div className="container">
    <div className="card card-login mx-auto mt-5">
      <div className="card-header">Register here</div>
        <div className="card-body">
            <form id="signup-form">
              <div className="form-group">
                <div className="form-label-group">
                  <input type="text" id="firstname" name="firstname" className="form-control" placeholder="Enter firstname" onChange={(e)=>{this.handleChange(e)}} />
                  <label htmlFor="firstname">firstname</label>
                  {this.state.firstnameError ? <span style={{color: "red"}}>Please Enter some value</span> : ''} 
                </div>
              </div>
              <div className="form-group">
                <div className="form-label-group">
                  <input type="text" id="lastname" name="lastname" className="form-control" placeholder="Enter lastname" onChange={(e)=>{this.handleChange(e)}} />
                  <label htmlFor="lastname">lastname</label>
                  {this.state.lastnameError ? <span style={{color: "red"}}>Please Enter some value</span> : ''}
                </div>
              </div>
              <div className="form-group">
                <div className="form-label-group">
                  <input type="email" id="email" name="email" className="form-control" placeholder="Enter your email" onChange={(e)=>{this.handleChange(e)}} />
                  <label htmlFor="email">email</label>
                  {this.state.emailError ? <span style={{color: "red"}}>Please Enter valid email address</span> : ''}
                </div>
              </div>                
              <div className="form-group">
                <div className="form-label-group">
                  <input type="password" id="password" name="password" className="form-control" placeholder="Password" onChange={(e)=>{this.handleChange(e)}} />
                  <label htmlFor="password">Password</label>
                  {this.state.passwordError ? <span style={{color: "red"}}>Please enter some   value</span> : ''}
                </div>
              </div>                
              <button className="btn btn-primary btn-block" disabled={this.state.isDisabled} onClick={this.submitForm}>Signup</button>
            </form>
        </div>
      </div>
    </div>
  );
 }
}
export default Signup;

Antwoord 4, autoriteit 3%

Probeer dit, bijvoorbeeld,
de vereiste eigenschap in de onderstaande invoertag zorgt ervoor dat het naamveld niet leeg wordt ingediend.

<input type="text" placeholder="Your Name" required />

Antwoord 5, autoriteit 3%

Met React Hook is formulier supereenvoudig gemaakt (React Hook Form: https://github .com/bluebill1049/react-hook-form)

ik heb je html-opmaak hergebruikt.

import React from "react";
import useForm from 'react-hook-form';
function Test() {
  const { useForm, register } = useForm();
  const contactSubmit = data => {
    console.log(data);
  };
  return (
    <form name="contactform" onSubmit={contactSubmit}>
      <div className="col-md-6">
        <fieldset>
          <input name="name" type="text" size="30" placeholder="Name" ref={register} />
          <br />
          <input name="email" type="text" size="30" placeholder="Email" ref={register} />
          <br />
          <input name="phone" type="text" size="30" placeholder="Phone" ref={register} />
          <br />
          <input name="address" type="text" size="30" placeholder="Address" ref={register} />
          <br />
        </fieldset>
      </div>
      <div className="col-md-6">
        <fieldset>
          <textarea name="message" cols="40" rows="20" className="comments" placeholder="Message" ref={register} />
        </fieldset>
      </div>
      <div className="col-md-12">
        <fieldset>
          <button className="btn btn-lg pro" id="submit" value="Submit">
            Send Message
          </button>
        </fieldset>
      </div>
    </form>
  );
}

Antwoord 6

Een schonere manier is om het joi-browserpakket te gebruiken. In de staat zou u een foutenobject moeten hebben dat alle fouten in het formulier bevat. In eerste instantie moet het worden ingesteld op een leeg object.
Schema maken;

import Joi from "joi-browser";
schema = {
    username: Joi.string()
      .required()
      .label("Username")
      .email(),
    password: Joi.string()
      .required()
      .label("Password")
      .min(8)
      .regex(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,1024}$/) //special/number/capital
   };

Bevestig vervolgens het formulier met het schema:

validate = () => {
    const options = { abortEarly: false };
    const result = Joi.validate(this.state.data, this.schema, options);
    console.log(data) // always analyze your data
    if (!result.error) return null; 
    const errors = {};
    for (let item of result.error.details) errors[item.path[0]] = item.message; //in details array, there are 2 properties,path and message.path is the name of the input, message is the error message for that input.
    return errors;
  };

Controleer het formulier voordat u het formulier verzendt:

handleSubmit = e => {
    e.preventDefault();
    const errors = this.validate(); //will return an object
    console.log(errors);
    this.setState({ errors: errors || {} }); //in line 9 if we return {}, we dont need {} here
    if (errors) return;
    //so we dont need to call the server
    alert("success");
    //if there is no error call the server
    this.dosubmit();
  };

Antwoord 7

We hebben tal van opties om de react js-formulieren te valideren. Misschien hebben de npm-pakketten een aantal eigen beperkingen. Op basis van uw behoeften kunt u de juiste validatorpakketten kiezen. Ik zou er een paar willen aanbevelen, die staan ​​hieronder vermeld.

Als iemand een betere oplossing weet dan deze, plaats deze dan in het commentaargedeelte voor referenties van andere mensen.


Antwoord 8

Misschien te laat om te antwoorden – als u uw huidige code niet vaak wilt wijzigen en toch dezelfde validatiecode voor uw hele project wilt hebben, kunt u deze ook proberen –
https://github.com/vishalvisd/react-validator.


Antwoord 9

Probeer powerform-react. Het is gebaseerd op powerform, een super draagbare Javascript-formulierbibliotheek. Eenmaal geleerd, kan het in elk kader worden gebruikt. Het werkt zelfs met vanilla Javascript.

Bekijk dit eenvoudige formulierdie gebruikmaakt van powerform-react

Er is ook een complex voorbeeld.


Antwoord 10

Ervan uitgaande dat u weet over react useState Hook, als uw formulier eenvoudig is, kunt u state-variabelen gebruiken om de waarde van elk invoerveld vast te houden. Voeg vervolgens de handlerfunctie onChangetoe aan elk invoerveld, waarmee de statusvariabelen worden bijgewerkt. Aan het einde kunt u de waarden controleren die zijn opgeslagen in toestandsvariabelen om er zeker van te zijn dat alle invoervelden enige waarde hadden. Hier is een eenvoudig voorbeeld.

import { useState } from "react";
export default function App() {
  const [name, setName] = useState("");
  const [email, setEmail] = useState("");
  const onChangeHandler = (fieldName, value)=>{
    if(fieldName === "name"){
      setName(value);
    }
    else if(fieldName==="email"){
      setEmail(value);
    }
  }
  const onSubmitHandler = (e)=>{
    e.preventDefault();
    if(name.trim()==="" || email.trim() ==""){
      alert("required both field");
    }
    else{
      alert(name+" " +email);
      setName("");
      setEmail("");
    }
  }
  return (
    <div className="App">
      <form onSubmit={(e)=>{onSubmitHandler(e)}}>
        <input type="text" value={name} onChange={(e)=>{ onChangeHandler("name",e.target.value)}} /> <br/>
         <input type="email"  value={email} onChange={(e)=>{ onChangeHandler("email",e.target.value)}} /> <br/>
         <input type="submit" value="Submit" />
        </form>
    </div>
  );
}

Als je echter een complexe vorm hebt, is het moeilijk om elke waarde in statusvariabelen te houden en vervolgens validatie op elk veld te gebruiken. Voor complexe formulieren is het aan te raden om Formikte gebruiken dat alles voor je doet en je kunt Yupvalidatiepakket dat ook wordt ondersteund door Formikwaarmee u meer kunt toevoegen dan alleen eenvoudige validatie.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

two × 5 =

Other episodes