Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
React Context, aynı React ağacındaki uzak bileşenlerin ortak bir değere props zinciri kurmadan erişmesi gerektiğinde kullanılır. Tema, dil, oturum açmış kullanıcı veya uygulama genelindeki ayarlar bunun tipik örnekleridir. Ancak her değişkeni Context'e taşımak doğru değildir; yalnızca belirli bir bileşen alt ağacının paylaşması gereken ve birçok seviyeden geçirilmesi zahmetli olan değerlerde tercih edilmelidir.

Context nasıl çalışır?​


Önce createContext ile bir Context oluşturulur. Değeri sağlayacak üst bileşen, alt ağacı Provider ile sarar. Alt bileşenler de useContext kullanarak en yakın sağlayıcının değerini okur. Sağlayıcının value değeri Object.is karşılaştırmasına göre değiştiğinde ilgili Context’i tüketen bileşenler güncellenir. Aynı alanları taşısa bile her render’da oluşturulan yeni bir nesne farklı değer kimliğidir.

Context bir veritabanı veya otomatik durum yönetimi sistemi değildir. Değerin kendisi çoğunlukla useState, useReducer ya da başka bir kaynaktan gelir; Context yalnızca bu değeri bileşen ağacında ulaştırır.

Hangi durumlarda uygundur?​


DurumContext kararıGerekçe
Tema veya görünüm ayarıGenellikle uygundurBirçok uzak bileşen aynı ayarı okur
Dil ve yerelleştirme bilgisiUygundurMetin ve biçimlendirme bileşenler arasında paylaşılır
Oturum açmış kullanıcıUygundurMenü, profil ve yetki kontrollü alanlar aynı bilgiyi kullanır
Yalnızca ebeveyn ile çocuğun kullandığı veriGerekmezProps daha açık ve daha kolay izlenir
Çok sık değişen büyük listeDikkatli kullanılmalıÇok sayıda tüketici gereksiz yeniden değerlendirme yapabilir

Context'in en güçlü kullanım alanı, aradaki bileşenlerin değeri kullanmadığı prop drilling problemidir. Örneğin üstteki uygulama bileşeni temayı, arada kalan sayfa ve yerleşim bileşenlerinden geçirerek düğmeye ulaştırmak zorunda kalıyorsa Context bu aktarımı sadeleştirir.

Çalışan bir tema örneği​


Aşağıdaki örnek, sağlayıcıyı kurar ve alt bileşenden temayı okur:

Kod:
import { createContext, useContext, useState } from "react";

const ThemeContext = createContext(null);

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState("light");

  const value = {
    theme,
    toggleTheme: () => {
      setTheme((current) => current === "light" ? "dark" : "light");
    }
  };

  return (
    <ThemeContext.Provider value={value}>
      {children}
    </ThemeContext.Provider>
  );
}

function ThemeButton() {
  const { theme, toggleTheme } = useContext(ThemeContext);

  return (
    <button type="button" onClick={toggleTheme}>
      Tema: {theme}
    </button>
  );
}

export default function App() {
  return (
    <ThemeProvider>
      <ThemeButton />
    </ThemeProvider>
  );
}

Uygulama çalıştığında düğmede önce Tema: light görünür; düğmeye basınca dark olur. Bu sonuç, ThemeButton bileşeninin aradaki props aktarımı olmadan sağlayıcıdaki değeri okuyabildiğini gösterir. Kendi uygulamanızda sağlayıcıyı yalnızca temaya ihtiyaç duyan sayfa veya uygulama bölümünün çevresine yerleştirin.

Örnek tema adını değiştirip düğmede gösterir; bütün sayfanın renklerini kendiliğinden değiştirmez. Gerçek tema stilleri ayrıca bu değere bağlanır. Provider her render’da yeni bir value nesnesi üretir; büyük bir uygulamada sorun ölçülürse sorumlulukları ayırma veya uygun memoization düşünülebilir. En baştan her değeri memoize etmek zorunlu değildir.

Uygulamaya karar verme adımları​


  1. Değerin kaç bileşen tarafından kullanılacağını belirleyin. Tek bir ebeveyn ve doğrudan çocuğu arasında kullanılıyorsa önce props ile başlayın.
  2. Değerin ortak bir anlamı olup olmadığını kontrol edin. Tema, dil, kullanıcı veya form kapsamı gibi bir kavramsa Context adayıdır.
  3. Context'i değere ihtiyaç duyan en küçük ortak üst bileşene yerleştirin; tüm uygulamayı gereksiz yere sarmalamayın.
  4. Değeri ve değiştirme işlemlerini anlaşılır bir nesneyle sağlayın. Tüketici bileşenlerinin sağlayıcının iç durumunu doğrudan değiştirmesine izin vermek yerine işlev sunun.
  5. Değer çok sık değişiyorsa veya tüketici sayısı fazlaysa güncellemelerin gereksiz bileşenleri etkileyip etkilemediğini gözlemleyin. Gerekirse Context'leri tema, kullanıcı ve ayar gibi ayrı sorumluluklara bölün.

Context’te kullanıcı bilgisi taşımak sunucudaki oturum ve yetkilendirmenin yerine geçmez. Tarayıcıdaki kullanıcı nesnesi veya bir menünün gizlenmesi API erişimi için güvenlik kanıtı değildir.

Sık yapılan hatalar​


Context'i tüm uygulama durumlarının varsayılan deposu yapmak, veri akışını görünmezleştirir ve bileşenlerin hangi değere bağlı olduğunu anlamayı zorlaştırır. Sık değişen bağımsız değerleri tek büyük Context nesnesinde toplamak da gereksiz yeniden değerlendirmeleri artırabilir. Ayrıca sağlayıcı dışında useContext çağırmak, oluşturulurken verilen varsayılan değerin kullanılmasına veya beklenmeyen bir sonuca yol açabilir. Bu nedenle zorunlu Context'lerde, sağlayıcı eksikse açık hata veren özel bir yardımcı hook yazmak daha güvenlidir.

Kaynaklar​



Sık sorulan sorular​


Context ile global değişken arasındaki fark nedir?​


Context değeri yalnızca belirli bir React ağacındaki sağlayıcı ve tüketiciler arasında paylaşır. Global değişken ise React'in veri akışı ve yeniden render mekanizmasının dışında kalabilir; bu yüzden arayüz güncellemeleri kendiliğinden ve öngörülebilir olmayabilir.

Her Context değişikliğinde tüm uygulama yeniden mi çizilir?​


Hayır. Esas olarak ilgili Context'i tüketen bileşenler güncellenir; ancak bu bileşenlerin alt ağacı ve sağlayıcı yapısı yine önemlidir. Değeri gereksiz yere sık değiştirmemek ve farklı sorumlulukları ayrı Context'lerde tutmak daha iyi kontrol sağlar.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.