React ReactDOM'in güçlü DOM işleme yardımcılarını keşfedin. Dinamik kullanıcı arayüzleri oluşturmak için ReactDOM.render, hydrate, unmountComponentAtNode ve findDOMNode hakkında bilgi edinin.
React ReactDOM: DOM İşleme Yardımcıları İçin Kapsamlı Bir Rehber
React, kullanıcı arayüzleri oluşturmak için güçlü bir JavaScript kütüphanesidir. Özünde React, Belge Nesne Modeli'nin (DOM) doğrudan manipülasyonunu soyutlayarak geliştiricilerin kullanıcı arayüzlerinin istenen durumunu tanımlamaya odaklanmasına olanak tanır. Ancak, React'in kendisinin bu kullanıcı arayüzü tanımlarını hayata geçirmek için tarayıcının DOM'u ile etkileşime girmesi gerekir. İşte bu noktada ReactDOM devreye girer. Bu paket, React bileşenlerini DOM'a işlemek ve onlarla etkileşimini yönetmek için özel yöntemler sunar.
ReactDOM'in Rolünü Anlamak
ReactDOM, React'in bileşen tabanlı dünyası ile tarayıcının DOM'u arasında köprü görevi görür. React bileşenlerini belirli DOM düğümlerine işleme, verileri değiştiğinde bunları güncelleme ve artık ihtiyaç duyulmadığında kaldırma gibi işlevler sunar. Bunu, React uygulamanızın tarayıcıdaki görsel temsilini yönlendiren motor olarak düşünebilirsiniz.
React ile ReactDOM'i ayırt etmek önemlidir. React, bileşenler oluşturmak ve durumu yönetmek için temel kütüphanedir. ReactDOM ise bu bileşenleri alıp tarayıcının DOM'una işlemekten sorumludur. React başka ortamlarda da kullanılabilirken (farklı bir işleme kütüphanesi kullanan mobil geliştirme için React Native gibi), ReactDOM özellikle web uygulamaları için tasarlanmıştır.
Temel ReactDOM Yöntemleri
ReactDOM paketinin sunduğu en önemli yöntemlerden bazılarını inceleyelim:
ReactDOM.render()
ReactDOM.render()
yöntemi, her React uygulamasının temelidir. Bir React bileşenini (veya bir bileşen ağacını) belirtilen bir DOM düğümüne monte etmekten (mount) sorumludur. Bu düğüm genellikle sayfanızdaki boş bir HTML öğesidir.
Sözdizimi:
ReactDOM.render(element, container[, callback])
element
: İşlemek istediğiniz React öğesi. Bu genellikle uygulamanızın en üst düzey bileşenidir.container
: Bileşeni monte etmek istediğiniz DOM öğesi. Bu, HTML'nizde geçerli bir DOM düğümü olmalıdır.callback
(isteğe bağlı): Bileşen işlendikten sonra yürütülecek bir işlev.
Örnek:
Diyelim ki App
adında basit bir React bileşeniniz var:
import React from 'react';
import ReactDOM from 'react-dom/client';
function App() {
return (
<div>
<h1>Merhaba, React!</h1>
<p>Bu basit bir React bileşenidir.</p>
</div>
);
}
Ve "root" ID'sine sahip bir öğe içeren bir HTML dosyanız var:
<div id="root"></div>
App
bileşenini "root" öğesine işlemek için şunu kullanırsınız:
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
Önemli Not (React 18 ve sonrası): React 18 ve sonrasında, ReactDOM.render
eski (legacy) olarak kabul edilir. Önerilen yaklaşım, yukarıda gösterildiği gibi ReactDOM.createRoot
kullanmaktır. Bu, React 18'de sunulan yeni eşzamanlı (concurrent) özellikleri etkinleştirir.
Güncellemeleri Anlamak: ReactDOM.render()
, bileşenin verileri değiştiğinde DOM'u güncellemekten de sorumludur. React, mevcut durumu istenen durumla verimli bir şekilde karşılaştırmak için sanal bir DOM kullanır ve yalnızca gerçek DOM'un gerekli kısımlarını güncelleyerek performans yükünü en aza indirir.
ReactDOM.hydrate()
ReactDOM.hydrate()
, sunucuda zaten işlenmiş bir React uygulamasını işlerken kullanılır. Bu, uygulamanızın ilk yükleme performansını iyileştirmek ve SEO'yu geliştirmek için önemli bir tekniktir.
Sunucu Tarafında İşleme (SSR): SSR'de, React bileşenleri sunucuda HTML'e dönüştürülür. Bu HTML daha sonra tarayıcıya gönderilir ve tarayıcı ilk içeriği hemen görüntüleyebilir. Ancak tarayıcının hala uygulamayı "hydrate" etmesi, yani olay dinleyicilerini eklemesi ve uygulamayı etkileşimli hale getirmesi gerekir. ReactDOM.hydrate()
, sunucuda işlenmiş HTML'i alır ve React olay yöneticilerini buna ekleyerek uygulamayı tamamen işlevsel hale getirir.
Sözdizimi:
ReactDOM.hydrate(element, container[, callback])
Parametreler ReactDOM.render()
ile aynıdır.
Örnek:
Sunucuda, React uygulamanızı bir dizeye dönüştürürsünüz:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';
const html = ReactDOMServer.renderToString(<App />);
Bu HTML daha sonra istemciye gönderilir.
İstemci tarafında, React olay yöneticilerini eklemek için ReactDOM.hydrate()
kullanırsınız:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.hydrate(<App />);
Hydration'ın Faydaları:
- İyileştirilmiş İlk Yükleme Süresi: Kullanıcılar, JavaScript kodu tam olarak yüklenmeden önce bile içeriği hemen görürler.
- Geliştirilmiş SEO: Arama motorları, tam olarak işlenmiş HTML'i tarayabilir ve dizine ekleyebilir.
ReactDOM.unmountComponentAtNode()
ReactDOM.unmountComponentAtNode()
, monte edilmiş bir bileşeni DOM'dan kaldırmak için kullanılır. Bu, kullanıcı arayüzünüzün bölümlerini dinamik olarak kaldırmanız gerektiğinde veya bir sayfadan ayrılmadan önce kaynakları temizlerken faydalı olabilir.
Sözdizimi:
ReactDOM.unmountComponentAtNode(container)
container
: Bileşenin monte edildiği DOM öğesi.
Örnek:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const rootElement = document.getElementById('root');
const root = ReactDOM.createRoot(rootElement);
root.render(<App />);
// Daha sonra, bileşeni kaldırmak için:
root.unmount();
ReactDOM.unmountComponentAtNode(rootElement)
çağrıldıktan sonra, App
bileşeni DOM'dan kaldırılacak ve onunla ilişkili tüm olay dinleyicileri ve kaynaklar temizlenecektir.
Ne Zaman Kullanılır:
- Bir modal veya diyalog kutusunu kullanıcı arayüzünden kaldırma.
- Farklı bir sayfaya geçmeden önce bir bileşeni temizleme.
- Farklı bileşenler arasında dinamik olarak geçiş yapma.
ReactDOM.findDOMNode() (Eski)
Önemli: ReactDOM.findDOMNode()
eski olarak kabul edilir ve modern React uygulamalarında kullanılması önerilmez. Daha önce monte edilmiş bir bileşenin temel DOM düğümüne erişmek için kullanılıyordu. Ancak, React'in soyutlamasını bozduğu ve özellikle işlevsel bileşenlerin ve kancaların (hooks) tanıtılmasıyla öngörülemeyen davranışlara yol açabildiği için kullanımı önerilmemektedir.
Alternatif Yaklaşımlar:
ReactDOM.findDOMNode()
kullanmak yerine, bu alternatif yaklaşımları göz önünde bulundurun:
- Ref'ler: DOM düğümlerine doğrudan erişmek için React ref'lerini kullanın. Bu, DOM öğeleriyle etkileşim için önerilen yaklaşımdır.
- Kontrollü Bileşenler: Durumlarını React ile yöneterek bileşenlerinizi "kontrollü" hale getirin. Bu, DOM'a doğrudan erişmeden kullanıcı arayüzünü manipüle etmenizi sağlar.
- Olay Yöneticileri: Bileşenlerinize olay yöneticileri ekleyin ve hedef DOM öğesine erişmek için olay nesnesini kullanın.
React 18 ve ReactDOM'da Eşzamanlılık (Concurrency)
React 18, React'in işleme görevlerini kesintiye uğratmasına, duraklatmasına, sürdürmesine veya terk etmesine olanak tanıyan yeni bir mekanizma olan eşzamanlılığı (concurrency) sunar. Bu, geçişler (transitions) ve seçici hydration gibi güçlü özelliklerin kilidini açarak daha akıcı ve daha duyarlı bir kullanıcı deneyimi sağlar.
ReactDOM Üzerindeki Etkisi: ReactDOM.createRoot
'un benimsenmesi, eşzamanlılığın faydalarından yararlanmak için çok önemlidir. Bu yöntem, uygulamanızın işlendiği bir kök oluşturur ve React'in işleme görevlerini daha verimli bir şekilde yönetmesini sağlar.
Geçişler (Transitions): Geçişler, belirli durum güncellemelerini acil olmayan olarak işaretlemenize olanak tanır, bu da React'in daha önemli güncellemeleri önceliklendirmesini ve duyarlılığı korumasını sağlar. Örneğin, rotalar arasında gezinirken, rota geçişini acil olmayan bir güncelleme olarak işaretleyebilir ve veri alımı sırasında bile kullanıcı arayüzünün duyarlı kalmasını sağlayabilirsiniz.
Seçici Hydration: Seçici hydration ile React, tüm uygulamayı bir kerede hydrate etmek yerine, tek tek bileşenleri talep üzerine hydrate edebilir. Bu, büyük uygulamalar için ilk yükleme süresini önemli ölçüde iyileştirir.
React ReactDOM için Global Hususlar
Küresel bir kitle için React uygulamaları geliştirirken, uluslararasılaştırma (i18n) ve yerelleştirme (l10n) gibi faktörleri göz önünde bulundurmak önemlidir. ReactDOM'in kendisi bu konuları doğrudan ele almaz, ancak onu i18n kütüphaneleri ve en iyi uygulamalarla entegre etmek çok önemlidir.
- Uluslararasılaştırma (i18n): Mühendislik değişiklikleri gerektirmeden farklı dillere ve bölgelere uyarlanabilen uygulamalar tasarlama ve geliştirme süreci.
- Yerelleştirme (l10n): Uluslararasılaştırılmış bir uygulamanın metinleri çevirerek, biçimlendirmeyi ayarlayarak ve kültürel farklılıkları ele alarak belirli bir dil veya bölge için uyarlanması süreci.
i18n Kütüphanelerini Kullanma:
react-i18next
ve globalize
gibi kütüphaneler, çevirileri, tarih ve saat biçimlendirmesini ve diğer yerelleştirme ile ilgili görevleri yönetmek için araçlar sağlar. Bu kütüphaneler genellikle React ve ReactDOM ile sorunsuz bir şekilde entegre olur.
react-i18next ile Örnek:
import React from 'react';
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return (
<div>
<h1>{t('greeting')}</h1>
<p>{t('description')}</p>
</div>
);
}
Bu örnekte, useTranslation
kancası, verilen anahtar için uygun çeviriyi alan t
çeviri işlevine erişim sağlar. Çevirilerin kendileri genellikle her dil için ayrı dosyalarda saklanır.
Sağdan Sola (RTL) Düzen:
Arapça ve İbranice gibi bazı diller sağdan sola yazılır. Bu diller için uygulamalar geliştirirken, kullanıcı arayüzünüzün RTL düzenini desteklediğinden emin olmanız gerekir. Bu genellikle metnin yönünü ayarlamayı, bileşenlerin düzenini yansıtmayı ve çift yönlü metni işlemeyi içerir.
ReactDOM Kullanımı için En İyi Uygulamalar
Verimli ve sürdürülebilir React uygulamaları sağlamak için, ReactDOM kullanırken şu en iyi uygulamaları izleyin:
- React 18 ve sonrasında
ReactDOM.createRoot
kullanın: Bu, uygulamanızı işlemek ve eşzamanlılığın faydalarından yararlanmak için önerilen yoldur. - Doğrudan DOM manipülasyonundan kaçının: DOM'u React'in yönetmesine izin verin. Doğrudan DOM manipülasyonu tutarsızlıklara ve performans sorunlarına yol açabilir.
- Ref'leri idareli kullanın: Ref'leri yalnızca bir giriş öğesine odaklanmak gibi belirli amaçlar için DOM düğümlerine doğrudan erişmeniz gerektiğinde kullanın.
- İşleme performansını optimize edin: Gereksiz yeniden işlemeleri önlemek için memoization ve shouldComponentUpdate gibi teknikleri kullanın.
- İyileştirilmiş performans ve SEO için sunucu tarafında işlemeyi düşünün.
- Uluslararasılaştırma ve yerelleştirme için i18n kütüphaneleri kullanın.
- Uygulamanızı farklı tarayıcılarda ve cihazlarda kapsamlı bir şekilde test edin.
Sonuç
ReactDOM, React ekosisteminin önemli bir parçasıdır ve React bileşenleri ile tarayıcının DOM'u arasında köprü görevi görür. ReactDOM.render()
, ReactDOM.hydrate()
ve ReactDOM.unmountComponentAtNode()
gibi temel yöntemleri anlayarak ve en iyi uygulamaları benimseyerek, performanslı, sürdürülebilir ve küresel olarak erişilebilir React uygulamaları oluşturabilirsiniz. React 18'de eşzamanlılığın tanıtılmasıyla, ReactDOM.createRoot
'u benimsemek yeni performans ve duyarlılık seviyelerinin kilidini açmak için çok önemlidir. Gerçekten kapsayıcı ve erişilebilir kullanıcı deneyimleri oluşturmak için küresel bir kitle için geliştirme yaparken uluslararasılaştırma ve yerelleştirme en iyi uygulamalarını göz önünde bulundurmayı unutmayın.