React setState geri araması ne zaman kullanılır?


191

Bir reaksiyon bileşeni durumu değiştiğinde, render yöntemi çağrılır. Dolayısıyla, herhangi bir durum değişikliği için, oluşturma yöntemleri gövdesinde bir eylem gerçekleştirilebilir. O zaman setState geri araması için özel bir kullanım durumu var mı?


4
Şu anda ne sorduğunuz belirsiz. Biraz kod ekleyebilir misiniz?
Davin Tryon

2
SetState geri çağrısı, durum DEFINITELYbeen değiştikten sonra yapmak istediğiniz her şey içindir. SetState zaman uyumsuz olduğundan, bir fx'i çağırmak ve yeni durumun yüklendiğinden emin olmak istiyorsanız, geri arama bunun için kullanılır
Jayce444

3
SetState geri araması için kullanım durumu oldukça açıktır. SPECIFIC durumu güncellendikten sonra bir işlevin çalışmasını istediğinizde kullanırsınız. Bu işlevi render()yerine koyarsanız , HERHANGİ bir durum her güncellendiğinde çalışır, bu muhtemelen istediğiniz şey değildir. Bu, kodunuzu daha az okunabilir ve mantıklı hale getirir.
M3RS

Yanıtlar:


225

Evet var, çünkü setStatebir asynchronousşekilde çalışıyor . Bu setState, this.statedeğişken çağrıldıktan sonra hemen değiştirilmediği anlamına gelir . bir durum değişkeninde durumu ayarladıktan hemen sonra bir eylem gerçekleştirmek ve ardından bir sonuç döndürmek istiyorsanız, geri arama yararlı olacaktır

Aşağıdaki örneği düşünün

....
changeTitle: function changeTitle (event) {
  this.setState({ title: event.target.value });
  this.validateTitle();
},
validateTitle: function validateTitle () {
  if (this.state.title.length === 0) {
    this.setState({ titleError: "Title can't be blank" });
  }
},
....

Yukarıdaki kod beklendiği gibi çalışmayabilir, çünkü titledeğişken üzerinde doğrulama yapılmadan önce mutasyona uğramamış olabilir. Şimdi, render()işlevin kendisinde doğrulama gerçekleştirebileceğimizi merak edebilirsiniz, ancak bunu changeTitle işlevinde halledebilmemiz daha iyi ve daha temiz bir yol olurdu, çünkü bu kodunuzu daha organize ve anlaşılır hale getirecektir.

Bu durumda geri arama yararlıdır

....
changeTitle: function changeTitle (event) {
  this.setState({ title: event.target.value }, function() {
    this.validateTitle();
  });

},
validateTitle: function validateTitle () {
  if (this.state.title.length === 0) {
    this.setState({ titleError: "Title can't be blank" });
  }
},
....

Başka bir örnek dispatch, durum değiştiğinde ve eylemde bulunmak olacaktır . bunu render()her yeniden oluşturma gerçekleştiğinde çağrılacak şekilde değil, bir geri aramada yapmak isteyeceksiniz ve bu nedenle geri aramaya ihtiyaç duyacağınız birçok senaryo mümkündür.

Başka bir dava API Call

Belirli bir durum değişikliğine dayalı bir API çağrısı yapmanız gerektiğinde, oluşturma yönteminde bunu yaparsanız, her oluşturma onStatedeğişikliğinde veya bazı Prop Child Componentdeğiştirilene geçtiği için çağrılabilir .

Bu durumda setState callback, güncellenmiş durum değerini API çağrısına iletmek için a kullanmak istersiniz.

....
changeTitle: function (event) {
  this.setState({ title: event.target.value }, () => this.APICallFunction());
},
APICallFunction: function () {
  // Call API with the updated value
}
....

3
Doğada asenkron olduğunu anlıyorum. Benim sorum, sadece setState geri aramasının belki de oluşturma yöntemleri gövdesinin desteklemeyebileceği belirli bir şey olmasıydı (daha iyi kod okunabilirliği diyelim.)
Sahil Jain

@SahilJain Doğrulama doğru örnektir, bunu render () işlevinde işlemek istemezsiniz çünkü daha sonra render () 'da herhangi bir değişiklik yaptığınızda çağrılırsınız. fonksiyonun kendisinde
Shubham Khatri

Reaksiyon, render işlemi sırasında durumun değiştirilmesini yasaklar. Bu nedenle, doğrulamayı geri aramaya koyma hakkı.
webdeb

if (this.title.length === 0) {olmalı this.state.title.length, değil mi?
Dmitry Minkovsky

4
İlk kullanım durumu muhtemelen iyi bir fikir değildir. setState geri çağrıları yeniden oluşturma işleminden sonra tetiklenir, bu nedenle iyi bir nedenden ötürü çift oluşturmaya neden olursunuz. İşlev argümanının (güncelleyici) amacı budur. Sadece çalıştırabilirsiniz setState(state => state.title.length ? { titleError: "Title can't be blank" } : null)ve değişiklik yığınlanır. Çift işlemeye gerek yoktur.
R Esmond

47
this.setState({
    name:'value' 
},() => {
    console.log(this.state.name);
});

14
Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde uzun vadeli değer artıracak göstererek neden bu soruna iyi bir çözüm olduğunu ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Machavity

1
Durum değiştikten sonra bir işlevi çağırmak istediğinizde yöntemi kullanabilirsiniz.
Araz Babayev

ad, ad vb. gibi birden fazla durum özelliği ayarlamak isterseniz ne olur?
Sumanth Varada

44

Aklıma gelen 1. apiusecase, render işlemine girmemesi gereken bir çağrıdır, çünkü eachdurum değişikliği için çalışacaktır . Ve API çağrısı her renderde değil, sadece özel durum değişikliğinde yapılmalıdır .

changeSearchParams = (params) => {
  this.setState({ params }, this.performSearch)
} 

performSearch = () => {
  API.search(this.state.params, (result) => {
    this.setState({ result })
  });
}

Dolayısıyla, herhangi bir durum değişikliği için, oluşturma yöntemleri gövdesinde bir eylem gerçekleştirilebilir.

Çok kötü uygulama , çünkü render-method saf olmalı, hiçbir eylem, durum değişikliği, api çağrısı yapılmamalıdır, sadece görüşünüzü birleştirin ve geri gönderin. Eylemler yalnızca bazı etkinliklerde gerçekleştirilmelidir. Oluşturma bir olay değil componentDidMount, örneğin.


25

SetState çağrısını düşünün

this.setState({ counter: this.state.counter + 1 })

IDEA

async işlevinde setState çağrılabilir

Yani güvenemezsin this. Yukarıdaki çağrı bir thiszaman uyumsuzluk işlevi içinde yapıldıysa , o anda bileşenin durumuna atıfta bulunacak, ancak bunun setState çağrısı veya zaman uyumsuz görev başlangıcındaki durum içindeki özelliğe başvurmasını bekledik. Ve görev eşzamansız çağrı olarak bu özellik zaman içinde değişmiş olabilir. Bu nedenle this, durumun bazı özelliklerine başvurmak için anahtar kelime kullanmak güvenilir değildir, bu nedenle argümanları previousState ve props olan geri çağırma işlevini kullanırız, bu da zaman uyumsuz görev yapıldığında ve setState çağrısı kullanarak durumu güncelleme zamanı geldi henüz başlamadı. NextState'in bozulmaması için güvenilirlik sağlamak.

Yanlış Kod: verilerin bozulmasına neden olur

this.setState(
   {counter:this.state.counter+1}
 );

Geri arama işlevine sahip setState ile Doğru Kod:

 this.setState(
       (prevState,props)=>{
           return {counter:prevState.counter+1};
        }
    );

Bu nedenle, şimdiki durumumuzu şu anda mülkün sahip olduğu değere göre bir sonraki duruma güncellememiz gerektiğinde ve tüm bunlar zaman uyumsuz bir şekilde gerçekleşiyorsa setState'i geri arama işlevi olarak kullanmak iyi bir fikirdir.

Ben burada codepen açıklamaya çalıştım KOD KALEM

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.