Avertissement: un composant modifie une entrée non contrôlée de type texte à contrôler. Les éléments d'entrée ne doivent pas passer de non contrôlés à contrôlés (ou vice versa). Décidez entre l'utilisation d'un élément d'entrée contrôlé ou non contrôlé pendant la durée de vie du composant. *
Voici mon code:
constructor(props) {
super(props);
this.state = {
fields: {},
errors: {}
}
this.onSubmit = this.onSubmit.bind(this);
}
....
onChange(field, e){
let fields = this.state.fields;
fields[field] = e.target.value;
this.setState({fields});
}
....
render() {
return(
<div className="form-group">
<input
value={this.state.fields["name"]}
onChange={this.onChange.bind(this, "name")}
className="form-control"
type="text"
refs="name"
placeholder="Name *"
/>
<span style={{color: "red"}}>{this.state.errors["name"]}</span>
</div>
)
}
javascript
reactjs
Riya Kapuria
la source
la source
fields
in state?Réponses:
La raison en est, dans l'état que vous avez défini:
champs comme un objet vide, donc lors du premier rendu
this.state.fields.name
seraundefined
, et le champ d'entrée obtiendra sa valeur comme:Pour cette raison, le champ de saisie deviendra incontrôlé.
Une fois que vous avez entré une valeur en entrée, l'
fields
état devient:Et à ce moment, le champ d'entrée est converti en un composant contrôlé; c'est pourquoi vous obtenez l'erreur:
Solutions possibles:
1- Définissez l'
fields
état in comme:2- Ou définissez la propriété value en utilisant une évaluation de court-circuit comme ceci:
la source
''
est une valeur de chaîne valide. Ainsi, lorsque vous passez''
à «xyz», le type d'entrée ne change pas les moyens contrôlés en contrôlés. Mais dans le cas deundefined
laxyz
catégorie passera de incontrôlée contrôlée.value={this.state.fields.name || ''}
Changer
value
pourdefaultValue
le résoudre.Remarque :
Je
value={this.state.input ||""}
eninput
pour se débarrasser de cet avertissement.la source
SIMPLEMENT, vous devez d'abord définir l'état initial
Si vous ne définissez pas l'état initial, réagir le traitera comme un composant non contrôlé
la source
À l'intérieur du composant, placez la zone de saisie de la manière suivante.
la source
En plus de la réponse acceptée, si vous utilisez un
input
typecheckbox
ouradio
, j'ai trouvé que je dois également vérifier l'checked
attribut null / undefined .Et si vous utilisez TS (ou Babel), vous pouvez utiliser la fusion nulle au lieu de l'opérateur logique OU:
la source
Définir l'état actuel en premier
...this.state
C'est parce que lorsque vous allez attribuer un nouvel état, il peut ne pas être défini. il sera donc fixé en définissant l'état d'extraction de l'état actuel également
S'il y a un objet dans votre état, vous devez définir l'état comme suit, supposons que vous devez définir le nom d'utilisateur dans l'objet utilisateur.
la source
génère une erreur dès que vous tapez dans le champ de texte
va résoudre le problème sur cet exemple de chaîne.
la source
Si vous utilisez plusieurs entrées dans le champ, suivez: Par exemple:
Recherchez votre problème sur:
la source
L'utilisation de React Hooks n'oublie pas non plus de définir la valeur initiale.
J'utilisais
<input type='datetime-local' value={eventStart} />
et l'initialeeventStart
était commeconst [eventStart, setEventStart] = useState();
à la place
const [eventStart, setEventStart] = useState('');
.La chaîne vide entre parenthèses est la différence.
De plus, si vous réinitialisez le formulaire après l'envoi comme je le fais, vous devez à nouveau le définir sur une chaîne vide, pas seulement sur des parenthèses vides.
Ceci est juste ma petite contribution à ce sujet, peut-être que cela aidera quelqu'un.
la source
Dans mon cas, c'était à peu près ce que dit la meilleure réponse de Mayank Shukla. Le seul détail était que mon état manquait complètement de la propriété que je définissais.
Par exemple, si vous avez cet état:
Si vous développez votre code, vous voudrez peut-être ajouter un nouvel accessoire afin que, ailleurs dans votre code, vous puissiez créer une nouvelle propriété
c
dont la valeur n'est pas seulement indéfinie sur l'état du composant, mais la propriété elle - même n'est pas définie.Pour résoudre ce problème, assurez-vous d'ajouter
c
à votre état et de lui donner une valeur initiale appropriée.par exemple,
J'espère que j'ai pu expliquer mon cas de bord.
la source
Je reçois le même avertissement: un composant modifie une entrée non contrôlée de type caché à contrôler. Je ne peux pas résoudre mon problème. Des idées pourquoi?
j'ai essayé
({ valueName, valueName: {geschlecht=""}, onChangeAllg,})
etvalue={valueName.geschlecht || ""}
la source
defaultValue={""}
manquait un intérieur du TextFieldAvertissement: un composant modifie une entrée non contrôlée de type texte à contrôler. Les éléments d'entrée ne doivent pas passer de non contrôlés à contrôlés (ou vice versa). Décidez entre l'utilisation d'un élément d'entrée contrôlé ou non contrôlé pendant la durée de vie du composant.
Solution: vérifiez si la valeur n'est pas indéfinie
React / Formik / Bootstrap / TypeScript
exemple :
la source