React.useState, durumu props'tan yeniden yüklemiyor


95

Durum değişikliğinde yeniden yüklenmesini bekliyorum, ancak bu çalışmıyor ve userdeğişken bir sonraki useStatearamada güncellenmiyor , sorun nedir?

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});
  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

Codepen

Yanıtlar:


210

UseState'e iletilen argüman, bir sınıf bileşeni için yapıcıdaki durumu ayarlamaya çok benzeyen ilk durumdur ve yeniden oluşturmada durumu güncellemek için kullanılmaz

Destek değişikliğindeki durumu güncellemek istiyorsanız, useEffectkancayı kullanın

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});

  React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

Çalışma demosu


18
Yapıcıda ilk durumu ayarlarken, yapıcının sınıf örneği oluştururken bir kez çağrıldığını anlamak açıktır. Hook'larla, useState her işlev çağrısında çağrılır ve her seferinde state'i başlatması gerekir gibi görünür, ancak bazı açıklanamayan "sihir" orada olur.
vitalyster

Belki bu gönderi biraz ışık
tutmuştur


2
Bu, başlangıç ​​durumunu iki kez ayarlamakla sonuçlanır ve bu oldukça can sıkıcıdır. İlk durumu null React.useEffectolarak ayarlayıp ayarlayamayacağınızı ve ardından her seferinde başlangıç ​​durumunu ayarlamak için kullanıp kullanamayacağınızı merak ediyorum .
CMCDragonkai

2
Durum aynı zamanda oluşturmayı da kontrol ediyorsa bu işe yaramaz. Sahne temelli ve duruma göre işleyen işlevsel bir bileşenim var. Durum, bileşene değiştiği için işlemesini söylerse, useEffect çalışır ve durumu varsayılan değere geri döndürür. Bu, kendi açılarından gerçekten kötü bir tasarım.
Greg Veres

1

useStateDeğişkenimize başlangıç ​​değerlerini ayarlamak için kullandığımız fonksiyonel bileşenler , eğer ilk değeri props üzerinden geçirirsek, siz useEffecthook'u kullanmayana kadar her zaman aynı başlangıç ​​değerini ayarlayacaktır.

örneğin davanız işinizi yapacak

 React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

UseEffect'e aktarılan işlev, render ekrana işlendikten sonra çalışacaktır.

Varsayılan olarak, efektler tamamlanan her işlemeden sonra çalışır, ancak bunları yalnızca belirli değerler değiştiğinde tetiklemeyi seçebilirsiniz.

React.useEffect(FunctionYouWantToRunAfterEveryRender)

useEffect'e yalnızca bir argüman iletirseniz, bu yöntemi her işlemeden sonra çalıştırır FunctionYouWantToRunAfterEveryRender, useEffect'e ikinci argümanı ileterek bunu ne zaman başlatacağınıza karar verebilirsiniz.

React.useEffect(FunctionYouWantToRunAfterEveryRender, [props.user])

[props.user] 'ı geçiyorum fark ettiğiniz gibi şimdi useEffectbu FunctionYouWantToRunAfterEveryRenderişlevi yalnızca props.userdeğiştirildiğinde çalıştıracak

Umarım bu, anlayışınıza yardımcı olur, herhangi bir iyileştirme gerekiyorsa bana bildirin, teşekkürler


0

Aktarılan parametre React.useState(), yalnızca bu durum için başlangıç ​​değeridir. React bunu durumu değiştirmek olarak algılamayacak, sadece varsayılan değerini ayarlayacak. Başlangıçta varsayılan durumu ayarlamak ve ardından koşullu olarak çağırmak setUser(newValue)isteyeceksiniz, bu yeni bir durum olarak tanınacak ve bileşeni yeniden oluşturacak.

Sürekli güncellenmesini önlemek için bir tür koşul olmaksızın durum güncellemesini dikkatli bir şekilde tavsiye ederim ve bu nedenle her sahne alındığında yeniden oluşturulmasını tavsiye ederim. Durum işlevselliğini bir ana bileşene yükseltmeyi ve üst öğenin durumunu bu Avatar'a bir destek olarak aktarmayı düşünebilirsiniz.


-2

Hook'larla ilgili ReactJS belgelerine göre :

Peki, bileşen ekranda iken arkadaş propu değişirse ne olur? Bileşenimiz farklı bir arkadaşın çevrimiçi durumunu göstermeye devam edecek. Bu bir hata. Ayrıca abonelikten çıkma çağrısı yanlış arkadaş kimliğini kullanacağından, bağlantıyı keserken bellek sızıntısına veya çökmeye neden oluruz.

Buradaki tek etkileşiminiz, işe yaramayacak gibi görünen bir sahne değişikliğinde gerçekleşmelidir. Props'taki herhangi bir güncellemeyi proaktif olarak yakalamak için bir componentDidUpdate (prevProps) kullanabilirsiniz (yine de belgeye göre).

Not: Yargılamak için yeterli kodum yok, ancak Avatar (props) işlevinizin içine aktif olarakUser () ayarlayamaz mısınız?


-12

React dünyasında, bu gibi durumlarda componentWillRecieveProps (nextProps) fonksiyonunda durumunuzu güncellemelisiniz.


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.