2015-03-26 19 views
112

EDIT: questo è un duplicato, vedere hereReactjs setState() con un nome chiave dinamico?

non riesco a trovare alcun esempio di utilizzo di un nome di chiave dinamica durante l'impostazione dello stato. Questo è quello che voglio fare:

inputChangeHandler : function (event) { 
    this.setState({ event.target.id : event.target.value }); 
}, 

dove event.target.id viene utilizzato come chiave di stato da aggiornare. Non è possibile in React?

+2

Questo è un duplicato di qualsiasi questione riguardante le chiavi degli oggetti dinamici. Non è specifico reagire –

+5

var newstate = {}; newstate [event.target.id] = event.target.id; this.setState (newstate); –

+0

Grazie, non ho avuto un buon controllo sull'utilizzo degli oggetti in generale. – trad

risposta

157

Grazie al suggerimento @ di Cory, ho usato questo:

inputChangeHandler : function (event) { 
    var stateObject = function() { 
     returnObj = {}; 
     returnObj[this.target.id] = this.target.value; 
     return returnObj; 
    }.bind(event)(); 

    this.setState(stateObject);  
}, 

Se si utilizza ES6 o Babel transpiler di trasformare il codice JSX, è possibile eseguire questa con computed property names, troppo:

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 }); 
} 
+13

C'è anche una nuova sintassi per questo, se stai usando bablejs per costruire il tuo codice. È possibile utilizzare 'nomi di proprietà calcolati' –

+0

Il secondo approccio causa l'errore di sintassi nei browser su Windows (IE, Chrome). Qualcuno ha notato? – benjaminz

+0

come si afferma? –

31

Come Ho realizzato questo ...

inputChangeHandler: function(event) { 
    var key = event.target.id 
    var val = event.target.value 
    var obj = {} 
    obj[key] = val 
    this.setState(obj) 
}, 
+0

semplice e fantastico, grazie – AmerllicA

+0

Ho fatto in modo simile ma il problema era che non eseguiva ancora il rendering del componente, e ho eseguito il pilastro per postare (incluso questo: D), e da qualche parte ho trovato questo: 'this.forceUpdate();' quale non dovrebbe essere il caso dell'ultimo React. Vediamo qual è il problema più tardi !! – xploreraj

-2

Può utilizzare una sintassi di diffusione, qualcosa li ke questo:

inputChangeHandler : function (event) { 
    this.setState({ 
     ...this.state, 
     [event.target.id]: event.target.value 
    }); 
}, 
+3

React farà l'unione dell'oggetto per te, questa è una cattiva pratica. – Rohmer

+1

setState unisce già lo stato con i nuovi oggetti di scena –

+1

in pratica se hai un oggetto interno e vuoi cambiarne uno proprio su quell'oggetto interno lo fai in questo modo: this.setState ({selectedItems: {... selectedItems, [item.id]: true}}) –

38

Quando è necessario gestire più elementi di input controllati, è possibile aggiungere un attributo name per ogni elemento e lasciare che la funzione del gestore scegliere cosa fare in base al valore di event.target.name.

Ad esempio:

inputChangeHandler(event) { 
 
    this.setState({ [event.target.name]: event.target.value }); 
 
}

+0

cosa indicano le parentesi intorno a [event.target.name]? Perché sono richiesti? – user798719

+0

Rispetto all'approccio usuale per denominare ciascun elemento separatamente come this.setState ({userName: e.target.value}); Questo gestirà più elementi di forma come una matrice e non è necessario impostare ogni singolo elemento –

Problemi correlati