2014-10-22 6 views
24

Ho un array in stato, diciamo this.state.arr. Desidero aggiungere qualcosa a questa proprietà di stato e quindi modificare alcune altre proprietà.React.js - Qual è il modo migliore per aggiungere un valore a un array nello stato

Opzione 1

onChange(event){ 
    this.state.arr.push('newvalue'); 
    ... 
    this.setState({some:'val',arr:this.state.arr}) 
} 

Opzione 2

onChange(event){ 
    var newArr = this.state.arr; 
    ... 
    newArr.push('newvalue'); 
    ... 
    this.setState({some:'val',arr:newArr}) 
} 

Quindi .. So this.state si suppone di essere trattati immutabile. Ma va bene usarlo come nell'opzione 1, dove ancora lo stato, oppure devo andare con qualcosa come l'opzione 2, e quindi sempre prima di fare una copia in memoria

+4

vedono questo http://stackoverflow.com/questions/26253351/correct-modification-of-state-arrays-in-reactjs#comment41184522_26253351 e questo http://stackoverflow.com/questions/23966438/what -è-il-preferito-modo-a-mutato-a-reagisce-stato – nilgun

+0

Una terza opzione potrebbe essere la migliore: utilizzare l'helper dell'immutabilità fornito da React: https://facebook.github.io/react/docs/update. html – rebe100x

risposta

32

Entrambe le opzioni fornito sono gli stessi. Entrambi continueranno a puntare allo stesso oggetto in memoria e avranno gli stessi valori di array. È necessario considerare l'oggetto stato come immutabile come hai detto, tuttavia è necessario ricreare l'array in modo che punti ad un nuovo oggetto, impostare il nuovo oggetto, quindi ripristinare lo stato. Esempio:

onChange(event){ 
    var newArray = this.state.arr.slice();  
    newArray.push("new value"); 
    this.setState({arr:newArray}) 
} 
+3

perché usare slice? –

+1

Slice creerà una nuova copia superficiale dell'array, rendendola immutabile. – Butters

+0

oh ... ok, grazie! –

25

Per ora, questo è il modo migliore.

this.setState(previousState => ({ 
    myArray: [...previousState.myArray, 'new value'] 
})); 
+1

Questo è esattamente ciò di cui ho bisogno. Molte grazie! –

12

Un altro modo semplice utilizzando concat:

this.setState({ 
    arr: this.state.arr.concat('new value') 
}) 
+3

Trovo che sia il metodo più espressivo e meno verboso. –

16

Se si sta utilizzando la sintassi ES6 è possibile utilizzare la spread operator per aggiungere nuovi elementi ad un array esistente come uno di linea.

// Append an array 
const newArr = [1,2,3,4] 
this.setState({ arr: [...this.state.arr, ...newArr] }); 

// Append a single item 
this.setState({ arr: [...this.state.arr, 'new item'] }); 
+2

La migliore risposta è imho. – BugHunterUK