Curieux de savoir quelle est la bonne façon d'aborder cela:
var Hello = React.createClass({
getInitialState: function() {
return {total: 0, input1:0, input2:0};
},
render: function() {
return (
<div>{this.state.total}<br/>
<input type="text" value={this.state.input1} onChange={this.handleChange} />
<input type="text" value={this.state.input2} onChange={this.handleChange} />
</div>
);
},
handleChange: function(e){
this.setState({ ??? : e.target.value});
t = this.state.input1 + this.state.input2;
this.setState({total: t});
}
});
React.renderComponent(<Hello />, document.getElementById('content'));
Évidemment, vous pouvez créer des fonctions handleChange distinctes pour gérer chaque entrée différente, mais ce n'est pas très agréable. De même, vous pouvez créer un composant uniquement pour une entrée individuelle, mais je voulais voir s'il existe un moyen de le faire comme ça.
javascript
reactjs
jsx
T3db0t
la source
la source
this.setState({ [e.target.name]: e.target.value });
Vous pouvez utiliser la
.bind
méthode pour préconstruire les paramètres de lahandleChange
méthode. Ce serait quelque chose comme:(J'ai également fait
total
être calculé au moment du rendu, car c'est la chose recommandée à faire.)la source
this.handleChange.bind(...)
crée une nouvelle fonction. Si vous utilisezshouldComponentUpdate
avecPureRenderMixin
ou quelque chose de similaire, il se cassera. Tous vos composants d'entrée seront renvoyés lorsqu'une seule valeur change.handleChange
à,handleChange(name) { return event => this.setState({name: event.target.value}); }
vous pouvez passer la "même" fonction (ne créera pas de nouvelle fonction comme c'est fait en utilisant.bind()
Then, vous pouvez passer une telle fonction:this.handleChange("input1")
this.setState(change, function () { console.log(this.state.input1); );
référence: stackoverflow.com/questions/30782948/...L'
onChange
événement bouillonne ... Vous pouvez donc faire quelque chose comme ceci:Et votre méthode setField peut ressembler à ceci (en supposant que vous utilisez ES2015 ou une version ultérieure:
J'utilise quelque chose de similaire dans plusieurs applications, et c'est assez pratique.
la source
Solution obsolète
valueLink/checkedLink
sont obsolètes depuis le cœur de React, car cela déroute certains utilisateurs. Cette réponse ne fonctionnera pas si vous utilisez une version récente de React. Mais si vous l'aimez, vous pouvez facilement l'émuler en créant votre propreInput
composantAncien contenu de la réponse:
Ce que vous voulez réaliser peut être réalisé beaucoup plus facilement en utilisant les assistants de liaison de données bidirectionnels de React.
Facile non?
http://facebook.github.io/react/docs/two-way-binding-helpers.html
Vous pouvez même implémenter votre propre mixin
la source
Vous pouvez également le faire comme ceci:
la source
[]
autour deinput
setState. Cela rend la propriété attribuée dynamiquementVous pouvez utiliser un
React
attribut spécial appeléref
puis faire correspondre les nœuds DOM réels dans l'onChange
événement en utilisantReact
lagetDOMNode()
fonction de:la source
prev
est juste un nom que j'ai défini dans larender()
méthodeevent.target === this.refs.prev
. facebook.github.io/react/blog/2015/10/07/…@Vigril Disgr4ce
Lorsqu'il s'agit de formulaires multi-champs, il est logique d'utiliser la fonctionnalité clé de React: les composants.
Dans mes projets, je crée des composants TextField, qui prennent au minimum une valeur prop, et il prend soin de gérer les comportements courants d'un champ de saisie de texte. De cette façon, vous n'avez pas à vous soucier de garder une trace des noms de champ lors de la mise à jour de l'état de la valeur.
la source
Vous pouvez suivre la valeur de chaque enfant
input
en créant unInputField
composant distinct qui gère la valeur d'un seulinput
. Par exemple, leInputField
pourrait être:Désormais, la valeur de chacun
input
peut être suivie dans une instance distincte de ceInputField
composant sans créer de valeurs distinctes dans l'état du parent pour surveiller chaque composant enfant.la source
Je vais fournir une solution vraiment simple au problème. Supposons que nous ayons deux entrées
username
etpassword
, mais que nous souhaitons que notre poignée soit simple et générique, nous pouvons donc la réutiliser et ne pas écrire de code standard.I.Notre formulaire:
II.Notre constructeur, dont nous voulons sauvegarder nos
username
etpassword
, afin que nous puissions y accéder facilement:III. Le descripteur intéressant et "générique" avec un seul
onChange
événement est basé sur ceci:Laisse-moi expliquer:
1.Les un changement est détecté , l'
onChange(event)
on appelleEnsuite, nous obtenons le paramètre de nom du champ et sa valeur:
let inputName = event.target.name; ex: username
let value = event.target.value; ex: itsgosho
Sur la base du paramètre de nom, nous obtenons notre valeur à partir de l'état dans le constructeur et la mettons à jour avec la valeur:
this.state['username'] = 'itsgosho'
4.La clé à noter ici est que le nom du champ doit correspondre à notre paramètre dans l'état
J'espère que j'ai aidé quelqu'un d'une manière ou d'une autre :)
la source
La clé de votre état doit être la même que le nom de votre champ de saisie. Ensuite, vous pouvez le faire dans la méthode handleEvent;
la source
Salut ont amélioré la réponse ssorallen . Vous n'avez pas besoin de lier la fonction car vous pouvez accéder à l'entrée sans elle.
la source