EDIT: ceci est un duplicata, voir ici
Je ne trouve aucun exemple d'utilisation d'un nom de clé dynamique lors de la définition de l'état. C'est ce que je veux faire:
inputChangeHandler : function (event) {
this.setState( { event.target.id : event.target.value } );
},
où event.target.id est utilisé comme clé d'état à mettre à jour. N'est-ce pas possible dans React?
Grâce au conseil de @ Cory, j'ai utilisé ceci:
inputChangeHandler : function (event) {
var stateObject = function() {
returnObj = {};
returnObj[this.target.id] = this.target.value;
return returnObj;
}.bind(event)();
this.setState( stateObject );
},
Si vous utilisez ES6 ou le transpiler Babel pour transformer votre code JSX, vous pouvez le faire avec noms de propriété calculés , aussi:
inputChangeHandler : function (event) {
this.setState({ [event.target.id]: event.target.value });
// alternatively using template strings for strings
// this.setState({ [`key${event.target.id}`]: event.target.value });
}
Lorsque vous devez gérer plusieurs éléments d'entrée contrôlés, vous pouvez ajouter un attribut name à chaque élément et laisser la fonction de gestionnaire choisir ce qu'elle doit faire en fonction de la valeur de event.target.name.
Par exemple:
inputChangeHandler(event) {
this.setState({ [event.target.name]: event.target.value });
}
Comment j'ai accompli ça ...
inputChangeHandler: function(event) {
var key = event.target.id
var val = event.target.value
var obj = {}
obj[key] = val
this.setState(obj)
},
Je voulais juste ajouter que vous pouvez également effectuer une déstructuration pour refactoriser le code et le rendre plus net.
inputChangeHandler: function ({ target: { id, value }) {
this.setState({ [id]: value });
},
En boucle avec .map
, procédez comme suit:
{
dataForm.map(({ id, placeholder, type }) => {
return <Input
value={this.state.type}
onChangeText={(text) => this.setState({ [type]: text })}
placeholder={placeholder}
key={id} />
})
}
Notez le paramètre []
dans type
. J'espère que cela t'aides :)
Avec ES6 +, vous pouvez simplement faire [${variable}
]