Je suis présenté avec un problème plutôt stupide. Je suis en train de créer ma première application React et j'ai rencontré un petit problème où je ne suis pas en mesure d'effacer ma valeur d'entrée après avoir soumis un formulaire. Un essayé googler ce problème, a trouvé quelques threads similaires ici, mais je ne pouvais pas résoudre ce problème. Je ne veux PAS changer l'état de mon composant/application, juste pour changer la valeur de l'entrée en une chaîne vide. J'ai essayé d'effacer la valeur de l'entrée dans ma fonction onHandleSubmit()
, mais j'ai eu une erreur:
"Impossible de définir la propriété 'valeur' de non définie".
Mon composant SearchBar:
import React, { Component } from "react";
class SearchBar extends Component {
constructor(props) {
super(props);
this.state = {
city: ""
};
this.onHandleChange = this.onHandleChange.bind(this);
this.onHandleSubmit = this.onHandleSubmit.bind(this);
}
render() {
return (
<form>
<input
id="mainInput"
onChange={this.onHandleChange}
placeholder="Get current weather..."
value={this.state.city}
type="text"
/>
<button onClick={this.onHandleSubmit} type="submit">
Search!
</button>
</form>
);
}
onHandleChange(e) {
this.setState({
city: e.target.value
});
}
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.mainInput.value = "";
}
}
export default SearchBar;
Vous avez un composant contrôlé où la valeur input
est déterminée par this.state.city
. Donc, une fois que vous soumettez, vous devez effacer votre état, ce qui effacera automatiquement votre saisie.
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.setState({
city: ''
});
}
Étant donné que votre champ de saisie est un élément contrôlé, vous ne pouvez pas modifier directement la valeur du champ de saisie sans modifier l'état.
Aussi dans
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.mainInput.value = "";
}
this.mainInput
ne fait pas référence à l'entrée puisque mainInput est une id
, vous devez spécifier une référence à l'entrée
<input
ref={(ref) => this.mainInput= ref}
onChange={this.onHandleChange}
placeholder="Get current weather..."
value={this.state.city}
type="text"
/>
Dans votre état actuel, le meilleur moyen consiste à effacer l'état pour effacer la valeur d'entrée
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.setState({city: ""});
}
Cependant, si pour une raison quelconque vous souhaitez conserver la valeur dans l'état même si le formulaire est soumis, vous préféreriez que l'entrée soit non contrôlée.
<input
id="mainInput"
onChange={this.onHandleChange}
placeholder="Get current weather..."
type="text"
/>
et mettez à jour la valeur dans l'état onChange
et onSubmit
, effacez l'entrée à l'aide de ref
onHandleChange(e) {
this.setState({
city: e.target.value
});
}
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.mainInput.value = "";
}
Cela dit, je ne vois aucun intérêt à maintenir l’état inchangé. La première option devrait donc être la voie à suivre.
this.mainInput
ne pointe réellement vers rien. Puisque vous utilisez un composant contrôlé (la valeur de l'entrée est obtenue à partir de l'état), vous pouvez définir this.state.city
sur null:
onHandleSubmit(e) {
e.preventDefault();
const city = this.state.city;
this.props.onSearchTermChange(city);
this.setState({ city: '' });
}
Dans votre fonction onHandleSubmit
, définissez votre état sur {city: ''}
comme suit:
this.setState({ city: '' });