React forwardRef'in amacını, uygulamasını, kullanım senaryolarını ve yüksek düzeyde yeniden kullanılabilir ve sürdürülebilir React bileşenleri oluşturmaya yönelik en iyi uygulamaları kapsayan kapsamlı bir rehber.
React forwardRef: Yeniden Kullanılabilir Bileşenler için Ref Yönlendirmede Uzmanlaşma
React dünyasında, yeniden kullanılabilir ve birleştirilebilir bileşenler oluşturmak her şeyden önemlidir. Ancak, bazen bir üst bileşenden alt bileşenin temel DOM düğümüne erişmeniz gerekir. İşte bu noktada React.forwardRef
kurtarmaya gelir. Bu kapsamlı rehber, forwardRef
'in inceliklerine inecek, amacını, uygulamasını, kullanım senaryolarını ve en iyi uygulamalarını açıklayacaktır.
Ref Yönlendirme Nedir?
Ref yönlendirme, React'te bir üst bileşenin, bir alt bileşenin DOM düğümüne veya React bileşen örneğine erişmesine olanak tanıyan bir tekniktir. Esasen, bir bileşene geçirilen bir ref'i alt bileşenlerinden birine "yönlendirir". Bu, özellikle bir alt bileşenin DOM'unu doğrudan manipüle etmeniz gerektiğinde, örneğin bir giriş alanına odaklanmak veya boyutlarını ölçmek gibi durumlarda kullanışlıdır.
forwardRef
olmadan, ref'ler yalnızca doğrudan DOM elemanlarına veya sınıf bileşenlerine eklenebilir. Fonksiyonel bileşenler doğrudan ref alamaz veya dışa aktaramaz.
Neden forwardRef
Kullanılır?
Birkaç senaryo forwardRef
kullanımını gerektirir:
- DOM Manipülasyonu: Bir alt bileşenin DOM'u ile doğrudan etkileşime girmeniz gerektiğinde. Örneğin, bir giriş alanına odaklanma, animasyonları tetikleme veya elemanları ölçme.
- Soyutlama: Özelleştirme veya uygulamanın diğer bölümleriyle entegrasyon için belirli DOM elemanlarını dışa aktarması gereken yeniden kullanılabilir UI bileşenleri oluştururken.
- Yüksek Mertebeden Bileşenler (HOC'ler): Bir bileşeni bir HOC ile sarmaladığınızda ve ref'lerin alttaki bileşene doğru bir şekilde geçirildiğinden emin olmanız gerektiğinde.
- Bileşen Kütüphaneleri: Bileşen kütüphaneleri oluştururken, ref yönlendirme geliştiricilerin bileşenlerinizin temel DOM elemanlarına erişmesine ve bunları özelleştirmesine olanak tanıyarak daha fazla esneklik sağlar.
forwardRef
Nasıl Çalışır?
React.forwardRef
, argüman olarak bir render fonksiyonu kabul eden bir yüksek mertebeden bileşendir (HOC). Bu render fonksiyonu, argüman olarak props
ve ref
alır. Render fonksiyonu daha sonra bir React elemanı döndürür. ref
argümanı, üst bileşenden bileşene geçirilen ref'tir. Daha sonra bu ref'i render fonksiyonu içindeki bir alt bileşene ekleyebilirsiniz.
İşte sürecin bir dökümü:
- Bir üst bileşen
useRef
kullanarak bir ref oluşturur. - Üst bileşen, ref'i bir prop olarak bir alt bileşene geçirir.
- Alt bileşen
React.forwardRef
ile sarmalanır. forwardRef
'in render fonksiyonu içinde, ref bir DOM elemanına veya başka bir React bileşenine eklenir.- Üst bileşen artık ref aracılığıyla DOM düğümüne veya bileşen örneğine erişebilir.
forwardRef
Uygulaması: Pratik Bir Örnek
forwardRef
'i basit bir örnekle gösterelim: üst bileşenin giriş alanına programatik olarak odaklanmasına olanak tanıyan özel bir giriş bileşeni.
Örnek: Ref Yönlendirmeli Özel Giriş Bileşeni
Öncelikle, özel giriş bileşenini oluşturalım:
import React, { forwardRef } from 'react';
const CustomInput = forwardRef((props, ref) => {
return (
<div>
<label htmlFor={props.id}>{props.label}</label>
<input type="text" id={props.id} ref={ref} {...props} />
</div>
);
});
CustomInput.displayName = "CustomInput"; // Daha iyi hata ayıklama için önerilir
export default CustomInput;
Bu örnekte:
forwardRef
'i 'react'ten import ediyoruz.- Fonksiyonel bileşenimizi
forwardRef
ile sarmalıyoruz. forwardRef
fonksiyonu argüman olarakprops
veref
alır.ref
'i<input>
elemanına ekliyoruz.- React DevTools'ta daha iyi hata ayıklama için
displayName
'i ayarlıyoruz.
Şimdi, bu bileşenin bir üst bileşende nasıl kullanılacağını görelim:
import React, { useRef, useEffect } from 'react';
import CustomInput from './CustomInput';
const ParentComponent = () => {
const inputRef = useRef(null);
useEffect(() => {
// Bileşen yüklendiğinde giriş alanına odaklan
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
<div>
<CustomInput label="İsim:" id="name" ref={inputRef} placeholder="İsminizi girin" />
</div>
);
};
export default ParentComponent;
Bu üst bileşende:
useRef
kullanarak bir ref oluşturuyoruz.inputRef
'iref
prop'u olarakCustomInput
bileşenine geçiriyoruz.useEffect
hook'u içinde,inputRef.current
kullanarak temel DOM düğümüne erişiyor vefocus()
metodunu çağırıyoruz.
ParentComponent
yüklendiğinde, CustomInput
bileşenindeki giriş alanı otomatik olarak odaklanacaktır.
forwardRef
Kullanım Senaryoları
İşte forwardRef
'in paha biçilmez olduğu bazı yaygın kullanım durumları:
1. Giriş Alanlarına Odaklanma
Yukarıdaki örnekte gösterildiği gibi, forwardRef
giriş alanlarına programatik olarak odaklanmanıza olanak tanır, bu da form doğrulama, erişilebilirlik ve kullanıcı deneyimi geliştirmeleri için kullanışlıdır. Örneğin, bir kullanıcı hatalı bir form gönderdikten sonra, kullanıcıyı yönlendirmek için hatalı olan ilk giriş alanına odaklanabilirsiniz.
2. Eleman Boyutlarını Ölçme
Bir alt bileşenin DOM düğümüne erişmek ve boyutlarını (genişlik, yükseklik, vb.) ölçmek için forwardRef
kullanabilirsiniz. Bu, duyarlı düzenler, dinamik boyutlandırma ve özel animasyonlar oluşturmak için kullanışlıdır. Sayfadaki diğer elemanların düzenini ayarlamak için dinamik bir içerik alanının yüksekliğini ölçmeniz gerekebilir.
3. Üçüncü Taraf Kütüphanelerle Entegrasyon
Birçok üçüncü taraf kütüphane, başlatma veya yapılandırma için DOM düğümlerine doğrudan erişim gerektirir. forwardRef
, bu kütüphaneleri React bileşenlerinizle sorunsuz bir şekilde entegre etmenize olanak tanır. Grafiği oluşturmak için hedef olarak bir DOM elemanı gerektiren bir grafik kütüphanesi kullandığınızı düşünün. forwardRef
, o DOM elemanını kütüphaneye sağlamanızı sağlar.
4. Erişilebilir Bileşenler Oluşturma
Erişilebilirlik genellikle DOM özelliklerinin doğrudan manipülasyonunu veya odak yönetimini gerektirir. forwardRef
, erişilebilirlik standartlarına uyan erişilebilir bileşenler oluşturmak için kullanılabilir. Örneğin, bir giriş alanını bir hata mesajıyla ilişkilendirmek için aria-describedby
özelliğini ayarlamanız gerekebilir. Bu, giriş alanının DOM düğümüne doğrudan erişim gerektirir.
5. Yüksek Mertebeden Bileşenler (HOC'ler)
HOC'ler oluştururken, ref'lerin sarmalanan bileşene doğru bir şekilde geçirildiğinden emin olmak önemlidir. forwardRef
bunu başarmanıza yardımcı olur. Bir bileşene stil ekleyen bir HOC'niz olduğunu varsayalım. forwardRef
kullanmak, stilli bileşene geçirilen tüm ref'lerin alttaki bileşene yönlendirilmesini sağlar.
forwardRef
Kullanımı için En İyi Uygulamalar
forwardRef
'i etkili bir şekilde kullandığınızdan emin olmak için şu en iyi uygulamaları göz önünde bulundurun:
1. Hata Ayıklama için displayName
Kullanın
Her zaman forwardRef
bileşenlerinizde displayName
özelliğini ayarlayın. Bu, onları React DevTools'ta tanımlamayı kolaylaştırır. Örneğin:
CustomInput.displayName = "CustomInput";
2. Performansa Dikkat Edin
forwardRef
güçlü bir araç olsa da, aşırı kullanıldığında performansı potansiyel olarak etkileyebilir. Gereksiz DOM manipülasyonundan kaçının ve render mantığınızı optimize edin. Ref yönlendirmeyle ilgili performans darboğazlarını belirlemek için uygulamanızı profilleyin.
3. Ref'leri Akıllıca Kullanın
Ref'leri React'in veri akışının bir yedeği olarak kullanmayın. Ref'ler idareli ve yalnızca DOM manipülasyonu veya üçüncü taraf kütüphanelerle entegrasyon için gerekli olduğunda kullanılmalıdır. Bileşen verilerini ve davranışını yönetmek için props ve state'e güvenin.
4. Bileşenlerinizi Belgeleyin
Bileşenlerinizde forwardRef
'i ne zaman ve neden kullandığınızı açıkça belgeleyin. Bu, diğer geliştiricilerin kodunuzu anlamasına ve bileşenlerinizi doğru kullanmasına yardımcı olur. Bileşenin nasıl kullanılacağına dair örnekler ve yönlendirilen ref'in amacını ekleyin.
5. Alternatifleri Düşünün
forwardRef
kullanmadan önce, daha uygun olabilecek alternatif çözümler olup olmadığını düşünün. Örneğin, DOM'u doğrudan manipüle etmek yerine props ve state kullanarak istenen davranışı elde edebilirsiniz. forwardRef
'e başvurmadan önce diğer seçenekleri keşfedin.
forwardRef
'e Alternatifler
forwardRef
genellikle ref'leri yönlendirmek için en iyi çözüm olsa da, belirli durumlarda düşünebileceğiniz alternatif yaklaşımlar vardır:
1. Callback Ref'ler
Callback ref'ler, DOM düğümlerine erişmek için daha esnek bir yol sağlar. Bir ref
prop'u geçirmek yerine, DOM düğümünü bir argüman olarak alan bir fonksiyon geçirirsiniz. Bu, DOM düğümü eklendiğinde veya çıkarıldığında özel mantık uygulamanıza olanak tanır. Ancak, callback ref'ler forwardRef
'ten daha ayrıntılı ve daha az okunabilir olabilir.
const MyComponent = () => {
let inputElement = null;
const setInputElement = (element) => {
inputElement = element;
};
useEffect(() => {
if (inputElement) {
inputElement.focus();
}
}, []);
return <input type="text" ref={setInputElement} />;
};
2. Kompozisyon
Bazı durumlarda, forwardRef
kullanmak yerine bileşenleri birleştirerek (composing) istenen davranışı elde edebilirsiniz. Bu, karmaşık bir bileşeni daha küçük, daha yönetilebilir bileşenlere ayırmayı ve aralarında props kullanarak veri ve davranış aktarmayı içerir. Kompozisyon, daha sürdürülebilir ve test edilebilir koda yol açabilir, ancak tüm senaryolar için uygun olmayabilir.
3. Render Prop'ları
Render prop'ları, değeri bir fonksiyon olan bir prop kullanarak React bileşenleri arasında kod paylaşmanıza olanak tanır. DOM düğümlerini veya bileşen örneklerini üst bileşene sunmak için render prop'larını kullanabilirsiniz. Ancak, render prop'ları, özellikle birden fazla render prop'u ile uğraşırken kodunuzu daha karmaşık ve okunması zor hale getirebilir.
Kaçınılması Gereken Yaygın Hatalar
forwardRef
ile çalışırken, bu yaygın hatalardan kaçınmak önemlidir:
1. displayName
Ayarlamayı Unutmak
Daha önce belirtildiği gibi, displayName
özelliğini ayarlamayı unutmak hata ayıklamayı zorlaştırabilir. forwardRef
bileşenleriniz için her zaman displayName
'i ayarlayın.
2. Ref'leri Aşırı Kullanmak
Her şey için ref kullanma eğilimine direnin. Ref'ler idareli ve yalnızca DOM manipülasyonu veya üçüncü taraf kütüphanelerle entegrasyon için gerekli olduğunda kullanılmalıdır. Bileşen verilerini ve davranışını yönetmek için props ve state'e güvenin.
3. İyi Bir Neden Olmadan DOM'u Doğrudan Manipüle Etmek
Doğrudan DOM manipülasyonu, kodunuzun bakımını ve test edilmesini zorlaştırabilir. Yalnızca kesinlikle gerekli olduğunda DOM'u manipüle edin ve gereksiz DOM güncellemelerinden kaçının.
4. Null Ref'leri Yönetmemek
Temel DOM düğümüne veya bileşen örneğine erişmeden önce ref'in null olup olmadığını daima kontrol edin. Bu, bileşen henüz yüklenmediğinde veya kaldırıldığında hataları önler.
if (inputRef.current) {
inputRef.current.focus();
}
5. Döngüsel Bağımlılıklar Oluşturmak
forwardRef
'i HOC'ler veya render prop'ları gibi diğer tekniklerle birlikte kullanırken dikkatli olun. Bileşenler arasında döngüsel bağımlılıklar oluşturmaktan kaçının, çünkü bu performans sorunlarına veya beklenmedik davranışlara yol açabilir.
Dünyadan Örnekler
React ve forwardRef
'in prensipleri evrenseldir, ancak farklı bölgelerdeki geliştiricilerin kullanımını nasıl uyarlayabileceğini düşünün:
- Yerelleştirme ve Uluslararasılaştırma (i18n): Avrupa veya Asya'da çok dilli uygulamalar geliştiren geliştiriciler, farklı diller için düzenleri dinamik olarak ayarlamak amacıyla yerelleştirilmiş metin elemanlarının boyutunu ölçmek için
forwardRef
kullanabilir, böylece metnin kapsayıcılardan taşmamasını sağlarlar. Örneğin, Almanca kelimeler İngilizce kelimelerden daha uzun olma eğilimindedir ve ayarlamalar gerektirir. - Sağdan Sola (RTL) Düzenler: Orta Doğu'da ve Asya'nın bazı bölgelerinde, uygulamaların genellikle RTL düzenlerini desteklemesi gerekir.
forwardRef
, mevcut düzen yönüne göre elemanların konumlandırılmasını programatik olarak ayarlamak için kullanılabilir. - Farklı Kullanıcılar için Erişilebilirlik: Küresel olarak, erişilebilirlik artan bir endişe kaynağıdır. Geliştiriciler, ekran okuyucular için elemanlara programatik olarak odaklanmak veya form alanlarının sekme sırasını ayarlamak gibi engelli kullanıcılar için erişilebilirliği artırmak amacıyla
forwardRef
kullanabilir. - Bölgeye Özgü API'lerle Entegrasyon: Yerel API'lerle (örneğin, ödeme ağ geçitleri, haritalama hizmetleri) entegrasyon yapan geliştiriciler, bu API'lerin gerektirdiği DOM elemanlarına erişmek için
forwardRef
kullanabilir, böylece uyumluluk ve sorunsuz entegrasyon sağlarlar.
Sonuç
React.forwardRef
, yeniden kullanılabilir ve birleştirilebilir React bileşenleri oluşturmak için güçlü bir araçtır. Üst bileşenlerin alt bileşenlerinin DOM düğümlerine veya bileşen örneklerine erişmesine izin vererek, forwardRef
, DOM manipülasyonundan üçüncü taraf kütüphanelerle entegrasyona kadar geniş bir kullanım senaryosu yelpazesi sunar. Bu kılavuzda belirtilen en iyi uygulamaları takip ederek, forwardRef
'i etkili bir şekilde kullanabilir ve yaygın hatalardan kaçınabilirsiniz. Ref'leri akıllıca kullanmayı, bileşenlerinizi açıkça belgelemeyi ve uygun olduğunda alternatif çözümleri düşünmeyi unutmayın. forwardRef
hakkında sağlam bir anlayışla, daha sağlam, esnek ve sürdürülebilir React uygulamaları oluşturabilirsiniz.