Bu tartışma bir süredir devam ediyor ve @Alexander T.'nin cevabı, benim gibi daha yeni React için izlenecek iyi bir rehber oldu. Ve bileşeni yenilemek için aynı API'yi birden çok kez çağırmakla ilgili bazı ek bilgiler paylaşacağım, bunun muhtemelen başlangıçta yeni başlayanların karşılaşabileceği yaygın bir sorun olduğunu düşünüyorum.
componentWillReceiveProps(nextProps)
, resmi belgelerden :
Özellik değişikliklerine yanıt olarak durumu güncellemeniz gerekirse (örneğin, sıfırlamak için), this.props ve nextProps'ı karşılaştırabilir ve bu yöntemde this.setState () kullanarak durum geçişleri gerçekleştirebilirsiniz.
Ana bileşenden props işlediğimiz, API çağrılarına sahip olduğumuz ve güncelleme durumunun burası olduğu sonucuna varabiliriz.
@Alexander T.'nin örneğine dayanarak:
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {person: []};
}
componentDidMount() {
//For our first load.
this.UserList(this.props.group); //maybe something like "groupOne"
}
componentWillReceiveProps(nextProps) {
// Assuming parameter comes from url.
// let group = window.location.toString().split("/")[*indexParameterLocated*];
// this.UserList(group);
// Assuming parameter comes from props that from parent component.
let group = nextProps.group; // Maybe something like "groupTwo"
this.UserList(group);
}
UserList(group) {
$.getJSON('https://randomuser.me/api/' + group)
.then(({ results }) => this.setState({ person: results }));
}
render() {
return (...)
}
}
Güncelleme
componentWillReceiveProps()
kullanımdan kaldırılacaktır.
Genel durumda API dağıtımı ile ilgili olacağını düşündüğüm yaşam döngüsündeki yalnızca bazı yöntemler (tümü Doc'ta ):
Yukarıdaki diyagrama başvurarak:
API'yi şurada dağıtın: componentDidMount()
Burada API çağrısına sahip olmak için uygun senaryo, bu bileşenin içeriğinin (API'nin yanıtından) statik olacağı componentDidMount()
, bileşen monte edilirken yalnızca bir kez tetikleneceği , hatta yeni proplar bile üst bileşenden geçilecek veya önderlik edilecek eylemlere sahip olacağıdır re-rendering
.
Bileşen, yeniden oluşturmak için farkı kontrol eder ancak yeniden monte etmez . Dokümandan
alıntı :
Uzak bir uç noktadan veri yüklemeniz gerekiyorsa, burası ağ talebini somutlaştırmak için iyi bir yerdir.
- API'yi şurada dağıtın:
static getDerivedStateFromProps(nextProps, prevState)
Biz iki çeşit olduğunu fark etmelidir bileşen güncellenmesi , setState()
şimdiki bileşeninde olur değil tetikleyici için bu yöntemi yönlendirmiyor, ancak gelen yeniden oluşturma ya da yeni sahne ebeveyn bileşeni yok. Bu yöntemin montaj sırasında da ateşlendiğini öğrendik.
Mevcut bileşeni bir şablon gibi kullanmak istiyorsak ve API için yeni parametreler üst bileşenden gelen props ise, API'yi dağıtmak için uygun bir yerdir .
API'den farklı bir yanıt alıyoruz ve state
bu bileşenin içeriğini değiştirmek için burada yeni bir yanıt gönderiyoruz .
Örneğin:
Üst bileşendeki farklı Arabalar için bir açılır listemiz var, bu bileşenin seçilenin ayrıntılarını göstermesi gerekiyor.
- API'yi şurada dağıtın:
componentDidUpdate(prevProps, prevState)
Farklı static getDerivedStateFromProps()
, bu yöntem ilk işleme hariç her işlemeden hemen sonra çağrılır. API çağrısı yapabilir ve tek bir bileşende fark oluşturabilirdik.
Önceki örneği genişletin:
Otomobilin ayrıntılarını gösterecek bileşen, bu otomobilin bir dizi listesini içerebilir, 2013 üretimini kontrol etmek istersek, setState()
bunu yansıtan bir ilke yönlendirmek için liste öğesini tıklayabilir veya seçebilir veya ... Bu bileşendeki davranış (liste öğesini vurgulamak gibi) ve aşağıda componentDidUpdate()
talebimizi yeni parametrelerle (durum) gönderiyoruz. Yanıtı aldıktan sonra, setState()
yine Araba detaylarının farklı içeriğini oluşturuyoruz. Aşağıdakilerin componentDidUpdate()
sonsuz döngüye neden olmasını önlemek için prevState
, API'yi gönderip yeni içeriği oluşturup oluşturmayacağımıza karar vermek için bu yöntemin başında kullanarak durumu karşılaştırmamız gerekir .
Bu yöntem gerçekten static getDerivedStateFromProps()
sahne donanımlarında olduğu gibi kullanılabilir , ancak değişikliklerini props
kullanarak halletmek gerekir prevProps
. Ve componentDidMount()
ilk API çağrısını idare etmek için işbirliği yapmamız gerekiyor .
Dokümandan alıntı :
... Mevcut donanımı önceki donanımlarla karşılaştırdığınız sürece burası ağ istekleri yapmak için de iyi bir yerdir ...
componentDidMount
.