695 votes

Un composant transforme une entrée non contrôlée de type texte en erreur contrôlée dans ReactJS.

Avertissement : Un composant modifie une entrée non contrôlée de type texte pour qu'elle soit contrôlée. Les éléments d'entrée ne doivent pas passer de non contrôlés à contrôlés (ou vice versa). Décidez d'utiliser un élément d'entrée contrôlé ou non contrôlé pendant toute 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>
  )
}

4 votes

Quelle est la valeur initiale de fields dans l'État ?

2 votes

Constructor(props) { super(props) ; this.state = { fields : {}, erreurs : {} } this.onSubmit = this.onSubmit.bind(this) ; }

2 votes

1voto

Nicolas Hedoire Points 33

Avertissement : Un composant modifie une entrée non contrôlée de type texte pour qu'elle soit contrôlée. Les éléments d'entrée ne doivent pas passer de non contrôlés à contrôlés (ou vice versa). Décidez d'utiliser un élément d'entrée contrôlé ou non contrôlé pendant toute la durée de vie du composant.

Solution : Vérifiez si la valeur n'est pas indéfinie.

React / Formik / Bootstrap / TypeScript

exemple :

{ values?.purchaseObligation.remainingYear ?
  <Input
   tag={Field}
   name="purchaseObligation.remainingYear"
   type="text"
   component="input"
  /> : null
}

1voto

khizer Points 51

Une approche multiple peut être appliquée :

  • Approche par classe : utiliser l'état local et définir un champ existant avec une valeur par défaut :

    constructor(props) { super(props); this.state = { value:'' } } <input type='text' name='firstName' value={this.state.value} className="col-12" onChange={this.onChange} placeholder='Enter First name' />

  • Utilisation de crochets React > 16.8 dans les composants de style fonctionnel :

    [value, setValue] = useState(''); <input type='text' name='firstName' value={value} className="col-12" onChange={this.onChange} placeholder='Enter First name' />

  • Si l'on utilise les propTypes et que l'on fournit une valeur par défaut pour les propTypes dans le cas d'un composant HOC de style fonctionnel.

    HOC.propTypes = { value : PropTypes.string } HOC.efaultProps = { value: '' }

    function HOC (){

    return (<input type='text' name='firstName' value={this.props.value} className="col-12" onChange={this.onChange} placeholder='Enter First name' />)

    }

1voto

Demetrio Gomez Points 111

Changez ceci

  const [values, setValues] = useState({intialStateValues});

pour cette

  const [values, setValues] = useState(intialStateValues);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X