React'teki En Yaygın Hata

CHUTTERSNAP'ın Unsplash'taki fotoğrafı

Bir React uygulamasında çözmeniz gereken en yaygın sorunlardan biri, harici verilerin alınmasıdır. Genel olarak, bu, nasıl çözüleceğini öğrendiğiniz ilk sorunlardan biridir, ancak uygulamaların çoğu basit bir hata yapar, monte edilmemiş bir bileşenin durumunu günceller .

Çok basit bir örnekle başlayacağız, gönderilerle ilgili verileri getiren, getirme devam ederken yükleme mesajı gösteren, hata durumunda hata gösteren ve başka bir durumda listeyi görüntüleyen bir Blog bileşeni. yazının.

const Blog = () => {
  const [posts, setPosts] = useState([]);
  const [status, setStatus] = useState('idle');
  const [error, setStatus] = useState(null);
useEffect(() => {
    const fetchData = async () => {
      setStatus('loading');
      try{
        setStatus('loading');
        const posts = await getAllPosts();
        setPosts(posts);
        setStatus('finished');
       } catch(e) {
         setStatus('error');
         setError(e);
       }
    }
  }, []);
if(status == 'error') return <p>Error while loading data</p>;
  if(status == 'loading') return <p>Loading...<p>;
  return <PostGrid posts={posts} />
};

İşlev getAllPosts, beklenen bir zaman uyumsuz işlevdir, bu işlevin geri dönmesi birkaç saniye sürebilir ve döndüğünde kod işlevi çağırmaya çalışır setPosts, ancak bu andan önce bileşen bağlantısı kaldırıldığında ne oldu?. Monte edilmemiş bir bileşenin durumunu ayarlayamadığınız için bir uyarı alırsınız.

const posts = await getAllPosts();
setPosts(posts);  # Warning: Can't perform a React state update on an unmounted component.
setStatus('finished');

getAllPostsAnahtar, durumu yalnızca bileşen monte edilmişse ayarlamaktır, bu durumda, bileşenin çağrıldıktan sonra monte edildiğinden emin olmanız gerekir . Bunun için, mevcut bileşenin takılı olup olmadığını kontrol etmek için mekanizmayı soyutlayan bir kanca kullanacağız.

const useIsMounted = () => {
  const isMounted = React.useRef(false);     // (1)
  React.useEffect(() => {
    isMounted.current = true;                // (2)
    return () => isMounted.current = false;  // (3)
  }, []);                                    // (3)
  return isMounted.current;
}

Artık orijinal bileşeninizle birlikte kullanabilirsiniz.

const Blog = () => {
  const [posts, setPosts] = useState([]);
  const [status, setStatus] = useState('idle');
  const [error, setStatus] = useState(null);
  const isMounted = useIsMounted();
useEffect(() => {
    const fetchData = async () => {
      setStatus('loading');
      try{
        const posts = await getAllPosts();
        if(isMounted) {
          setPosts(posts);                    // 1
          setStatus('finished');
        }
} catch(e) {
          if(isMounted) {
            setStatus('error');               // 2
            setError(e);
          }
       }
    }
  }, []);
if(status == 'error') return <p>Error while loading data</p>;
  if(status == 'finished') return <PostList posts={posts} />
  return <p>Loading...<p>;
};

Sonuçlar

Monte edilmemiş bir bileşenin durumunu güncellemeye çalışmak, tepki veren uygulamalarda çok yaygın bir sorundur, bu sorun genellikle bazı harici verileri getirdiğinizde sunulur, ancak aynı sorun, durum üzerinde bazı değişiklikleri tetikleyen herhangi bir zaman uyumsuz olayı kullandığınızda da sunulur. onun tamamlanması.

Okuduğunuz için teşekkürler!

Bu gönderi bu kadar, umarım içerik beğeninize olmuştur, bir sonraki gönderide görüşmek üzere.

PlainEnglish.io'da daha fazla içerik . Ücretsiz haftalık bültenimize kaydolun . Bizi Twitter ve LinkedIn'de takip edin . Topluluğumuza katılın Discord .

Suggested posts

Sanat Hiç Apolitik midir?

Sanat Hiç Apolitik midir?

Dün, İsveçli şarkıcı Loreen'in kupayı evine götürdüğü, iki kez kazanan ilk kadın olduğu ve ABBA'nın yarışmayı kazanmasından 50 yıl sonra tacı İsveç'e geri getirdiği ışıltılı, kaotik bir büyük finalle bu yılki Eurovision Şarkı Yarışması'nın kapısını kapattık. "Waterloo" ile. Pop müzik kanonundaki en büyük oyunculardan biri olmaya devam ettiler.

kovboy yalanı

Mega şirketler Amerikalılara nasıl büyük bir yalan sattı?

kovboy yalanı

Güneşin ilk ışınları düzlüklerdeki buzlu çimleri aydınlatırken, batının engebeli tepelerinde parıldayan altın rengi bir sabah. Simsiyah ve iri, sakin bir Angus sığır sürüsü, hepsinin iyi bildiği bir yere giden ıssız bir patikadan aşağı inerken güneşin doğuşuna karşı siluet oluşturuyor; kahvaltı barı.

Related posts

Neden bazı serbest çalışanlar hayatlarını taklit ediyorlar?

Neden bazı serbest çalışanlar hayatlarını taklit ediyorlar?

Geçenlerde dünyanın en büyük profesyonel sosyal ağı olan Linkedin'deydim ve dikkatimi çeken, takip ettiğim serbest tasarımcıların gönderilerini buldum. Hepsi uçaklardan, dizüstü bilgisayarlarıyla sahilden, yüzme havuzlarından ve muhteşem manzaralı ofislerden fotoğraflar yayınladılar.

Sadece Bir Telefon Numarasıyla Herkesi Takip Edin | OSINT Soruşturması

Sadece Bir Telefon Numarasıyla Herkesi Takip Edin | OSINT Soruşturması

Bir OSINT Araştırmacısı, CTF Oyuncusu veya yalnızca istenmeyen aramalar alan biri olabilirsiniz. Bir reklamda gördüğünüz numarayı doğrulamaya çalışan biri.

zamirler süper korkutucu

Çoğu zaman olduğu gibi birdenbire gözüme çarpıyor Her şey yeniden yarı yolda <Hayır, Pasifik'te kesip attığınız değil, karnavalda olan> Her manşet yüksek sesle… ..

Bir Çocuğun İlk Kafasını Yükseltme Kitabı

Bir Çocuğun İlk Kafasını Yükseltme Kitabı

(Uyarı- Bu Hiciv, Neşeyle Yıkıcı Olma Amaçlıdır- Kesinlikle çocuklar için değildir) Annenizi ve babanızı mutfakta saklanıp o kokulu sigaraları içerken gördünüz. Sana söylerler.