Yanıtlar:
this.state.myArray.push('new value')
dizinin kendisi yerine genişletilmiş dizinin uzunluğunu döndürür. Array.prototype.push () .
Sanırım döndürülen değerin dizi olmasını bekliyorsunuz.
Görünüşe göre daha çok React'in davranışı:
Bu.state'i ASLA doğrudan değiştirmeyin, çünkü daha sonra setState () çağrısı yaptığınız mutasyonun yerini alabilir. Bunu, değişmezmiş gibi ele alın. React.Component .
Sanırım, bunu şu şekilde yapardınız (React'e aşina değilsiniz):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
setState()
Bileşen durumundaki değişiklikleri sıralar ve React'e bu bileşenin ve alt bileşenlerinin güncellenmiş durumla yeniden oluşturulması gerektiğini söyler. Sanırım, ayarladıktan hemen sonra o anda güncellenmiyor. Lütfen hangi noktayı ayarladığınızı ve kaydettiğinizi görebileceğimiz bir kod örneği gönderebilir misiniz?
.concat('new value');
olmalıdır .concat(['new value']);
concat()
yöntem için mükemmel şekilde geçerlidir . Bakınız: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ( Yeni bir diziye birleştirilecek diziler ve / veya değerler. )
Es6 kullanarak şu şekilde yapılabilir:
this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array
this.props
ve this.state
eşzamansız olarak güncellenebilir, bir sonraki durumu hesaplarken onların değerlerine güvenmemelisiniz." Bir diziyi değiştirme durumunda, dizi zaten bir özelliği olarak mevcut olduğundan this.state
ve yeni bir değer ayarlamak için onun değerine başvurmanız gerektiğinden setState()
, önceki durumu bağımsız değişken olarak kabul eden bir işlevi kullanmalısınız . Örnek: this.setState(prevState => ({ myArray: [...this.state.myArray, 'new value'] }));
Bkz: reactjs.org/docs/…
Devletin doğrudan mutasyona uğratılması asla tavsiye edilmez
Sonraki React sürümlerinde önerilen yaklaşım, yarış koşullarını önlemek için durumları değiştirirken bir güncelleme işlevi kullanmaktır:
Dizeyi dizinin sonuna itin
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
Dizeyi dizinin başına it
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
Nesneyi dizinin sonuna it
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
Nesneyi dizinin başına it
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
this.setState((prevState) => ({ myArray: [values, ...prevState.myArray], }));
Eyaleti hiç işletmemelisiniz. En azından doğrudan değil. Dizinizi güncellemek istiyorsanız, bunun gibi bir şey yapmak isteyeceksiniz.
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
Doğrudan durum nesnesi üzerinde çalışmak arzu edilmez. React'in değişmezlik yardımcılarına da göz atabilirsiniz.
.slice()
yeni bir dizi oluşturmak ve değişmezliği korumak için de kullanıyor . Yardım için teşekkürler.
.concat
Dizinizin kopyasını yeni verilerle oluşturmak için yöntemi kullanabilirsiniz :
this.setState({ myArray: this.state.myArray.concat('new value') })
Ancak .concat
dizileri iletirken yöntemin özel davranışına dikkat edin - [1, 2].concat(['foo', 3], 'bar')
sonuç olacaktır [1, 2, 'foo', 3, 'bar']
.
Bu Kod benim için çalışıyor:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.push.apply(this.state.mystate, json)})
})
fetch(`api.openweathermap.org/data/2.5/forecast?q=${this.searchBox.value + KEY} `) .then( response => response.json() ) .then( data => { this.setState({ reports: this.state.reports.push.apply(this.state.reports, data.list)}); });
this.state = { reports=[] }
... lütfen neyi yanlış yaptığımı bilmek isterim
Kullanıcı arayüzünüzün de (ör. ur flatList) güncel olmasını istiyorsanız, PrevState'i kullanın: aşağıdaki örnekte kullanıcı düğmeyi tıklarsa, listeye yeni bir nesne ekleyecektir (hem modelde hem de kullanıcı arayüzünde )
data: ['shopping','reading'] // declared in constructor
onPress={() => {this.setState((prevState, props) => {
return {data: [new obj].concat(prevState.data) };
})}}.
Aşağıdaki şekilde nesneleri kontrol edip güncelleyebiliriz
this.setState(prevState => ({
Chart: this.state.Chart.length !== 0 ? [...prevState.Chart,data[data.length - 1]] : data
}));
Burada nesneyi böyle bir durum dizisine itemezsiniz. Normal dizide kendi yolunuz gibi itebilirsiniz. Burada durumu ayarlamalısın,
this.setState({
myArray: [...this.state.myArray, 'new value']
})
Sadece durumu böyle güncellemeye çalışıyorsanız
handleClick() {
this.setState(
{myprop: this.state.myprop +1}
})
}
Bu yaklaşımı düşünün
handleClick() {
this.setState(prevState => {
return {
count: prevState.count + 1
}
})
}
Temelde prevState this.state'i bizim için yazıyor.
console.log(this.state.myArray)
her zaman arkamda olur. Herhangi bir fikrin neden?