J'essaie actuellement d'ajouter une validation à un formulaire construit à l'aide de composants material-ui. Je le fais mais le problème est que de la manière dont je le fais actuellement, la fonction de validation est actuellement appelée à chaque changement d'état dans l'entrée (c'est-à-dire chaque lettre tapée). Cependant, je souhaite que ma validation ne se produise qu'une fois le typage arrêté.
Compte tenu de mon code actuel:
class Form extends React.Component {
state = {open: false, email: '', password: '', email_error_text: null, password_error_text: null, disabled: true};
handleTouchTap() {
this.setState({
open: true,
});
}
isDisabled() {
let emailIsValid = false;
let passwordIsValid = false;
if (this.state.email === "") {
this.setState({
email_error_text: null
});
} else {
if (validateEmail(this.state.email)) {
emailIsValid = true
this.setState({
email_error_text: null
});
} else {
this.setState({
email_error_text: "Sorry, this is not a valid email"
});
}
}
if (this.state.password === "" || !this.state.password) {
this.setState({
password_error_text: null
});
} else {
if (this.state.password.length >= 6) {
passwordIsValid = true;
this.setState({
password_error_text: null
});
} else {
this.setState({
password_error_text: "Your password must be at least 6 characters"
});
}
}
if (emailIsValid && passwordIsValid) {
this.setState({
disabled: false
});
}
}
changeValue(e, type) {
const value = e.target.value;
const nextState = {};
nextState[type] = value;
this.setState(nextState, () => {
this.isDisabled()
});
}
login() {
createUser(this.state.email, this.state.password);
this.setState({
open: false
});
}
render() {
let {open, email, password, email_error_text, password_error_text, disabled} = this.state;
const standardActions = (
<FlatButton
containerElement={<Link to="/portal" />}
disabled={this.state.disabled}
label="Submit"
onClick={this.login.bind(this)}
/>
);
return (
<div style={styles.container}>
<Dialog
open={this.state.open}
title="Enter Your Details to Login"
actions={standardActions}
>
<span className="hint--right hint--bounce" data-hint="Enter in your email address">
<TextField
hintText="Email"
floatingLabelText="Email"
type="email"
errorText={this.state.email_error_text}
onChange={e => this.changeValue(e, 'email')}
/>
</span>
<br />
<span className="hint--right hint--bounce" data-hint="Enter your password">
<TextField
hintText="Password"
floatingLabelText="Password"
type="password"
errorText={this.state.password_error_text}
onChange={e => this.changeValue(e, 'password')}
/>
</span>
</Dialog>
<h1>VPT</h1>
<h2>Project DALI</h2>
<RaisedButton
label="Login"
primary={true}
onTouchTap={this.handleTouchTap.bind(this)}
/>
</div>
);
}
}
export default Form;
Existe-t-il un moyen de réaliser les fonctionnalités souhaitées sans apporter de modification majeure au code ou faut-il le refacturer complètement?
Toute aide serait très appréciée
Merci pour votre temps
La vérification doit-elle avoir lieu après un certain délai? Une solution qui, à mon avis, suffirait dans la plupart des situations serait de scinder légèrement votre code. Ne déclenchez pas votre fonction isDisabled()
dans changedValue()
. Au lieu de cela, exécutez-le sur l'événement onBlur
.
Essaye ça:
<TextField
hintText="Password"
floatingLabelText="Password"
type="password"
errorText={this.state.password_error_text}
onChange={e => this.changeValue(e, 'password')}
onBlur={this.isDisabled}
/>
et alors votre fonction devient:
changeValue(e, type) {
const value = e.target.value;
const nextState = {};
nextState[type] = value;
this.setState(nextState);
}
Cette bibliothèque que j'avais créée, s'occupe de tout ce qui concerne la validation des champs et supporte également les composants matériel-ui ...
Pour valider vos champs, il vous suffit d’envelopper votre composant de champ et vous avez terminé ... épargnez beaucoup d’efforts pour gérer vous-même l’état manuellement.
<Validation group="myGroup1"
validators={[
{
validator: (val) => !validator.isEmpty(val),
errorMessage: "Cannot be left empty"
}, ...
}]}>
<TextField value={this.state.value}
className={styles.inputStyles}
style={{width: "100%"}}
onChange={
(evt)=>{
console.log("you have typed: ", evt.target.value);
}
}/>
Le plus simple est d'appeler form.reportValidity()
. form
peut être obtenu en appelant event.currentTarget.form
.
Je viens de publier package npm pour valider les formulaires. Vous trouverez des exemples de travail sur mon profil github
Vous pouvez utiliser un événement de champ de texte flou. Est déclenché lorsque l'entrée perd le focus.