web-dev-qa-db-fra.com

Reactjs setState () avec un nom de clé dynamique?

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?

210
trad

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 });
}
244
trad

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 });
}
114
vikram jeet singh

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)
},
39
sintaxi

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 });
},
14
saulable

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 :)

9
Johnatan Maciel

Avec ES6 +, vous pouvez simplement faire [${variable}]

1
Jujhar Singh