createRoot
createRoot
React bileşenlerini bir tarayıcı DOM düğümü içinde görüntülemek için bir kök oluşturmanızı sağlar.
const root = createRoot(domNode, options?)
- Referans
- Kullanım
- Sorun Giderme
- Bir kök oluşturdum, fakat hiçbir şey görüntülenmiyor.
- Bir hata alıyorum: “root.render’a ikinci bir argüman geçtiniz”
- Bir hata alıyorum: “Hedef kapsayıcı bir DOM öğesi değil”
- Bir hata alıyorum: “Fonksiyonlar bir React alt elemanı olarak geçerli değildir.”
- Sunucu tarafından render edilen HTML’im sıfırdan yeniden oluşturuluyor
Referans
createRoot(domNode, options?)
İçeriği bir tarayıcı DOM elemanı içinde görüntülemek üzere bir React kökü oluşturmak için createRoot
çağrısı yapın.
import { createRoot } from 'react-dom/client';
const domNode = document.getElementById('root');
const root = createRoot(domNode);
React, domNode
için bir kök oluşturacak ve içindeki DOM’un yönetimini üstlenecek. Bir kök oluşturduktan sonra, içinde bir React bileşeni görüntülemek için root.render
çağırmanız gerekir:
root.render(<App />);
Tamamen React ile oluşturulmuş bir uygulama genellikle kök bileşeni için yalnızca bir createRoot
çağrısına sahip olacaktır. Sayfanın bazı bölümleri için React “serpintileri” kullanan bir sayfa, ihtiyaç duyulan kadar çok sayıda ayrı köke sahip olabilir.
Daha fazla örnek için aşağıya bakın.
Parametreler
-
domNode
: Bir DOM elemanı. React bu DOM elemanı için bir kök oluşturacak verender
gibi render edilmiş React içeriğini görüntülemek için kök üzerinde fonksiyonlar çağırmanıza izin verecektir. -
opsiyonel
options
: Bu React kökü için seçenekler içeren bir nesne.- Canary only opsiyonel
onCaughtError
: React bir Hata yakalayıcı bir hata yakaladığında callback yapılır. Hata yakalayıcı tarafından yakalananerror
vecomponentStack
içeren birerrorInfo
nesnesi ile çağrılır. - Canary only opsiyonel Bir hata fırlatıldığında ve bir Hata yakalayıcı tarafından yakalanmadığında callback yapılır. Atılan hata ve
componentStack
’i içeren birerrorInfo
nesnesi ile çağrılır. - opsiyonel
onRecoverableError
: React’in hatalardan otomatik olarak kurtulduğunda çağrılan callback fonksiyonu. React’in attığı birerror
vecomponentStack
içeren birerrorInfo
nesnesi ile çağrılır. Bazı kurtarılabilir hatalar,error.cause
olarak orijinal hata nedenini içerebilir. - opsiyonel
identifierPrefix
:useId
tarafından oluşturulan kimlikler için React’in kullandığı bir dize öneki. Aynı sayfada birden fazla kök kullanırken çakışmaları önlemek için kullanışlıdır.
- Canary only opsiyonel
Döndürülenler
createRoot
render
ve unmount
olmak üzere iki yöntem içeren bir nesne döndürür.
Uyarılar
- Uygulamanız sunucu tarafından oluşturulmuşsa,
createRoot()
kullanımı desteklenmez. Bunun yerinehydrateRoot()
kullanın. - Uygulamanızda muhtemelen yalnızca bir
createRoot
çağrısı olacaktır. Eğer bir çatı kullanıyorsanız, bu çağrıyı sizin için yapabilir. - Bileşeninizin alt öğesi olmayan DOM ağacının farklı bir bölümünde bir JSX parçası render etmek istediğinizde (örneğin, bir modal veya bir araç ipucu),
createRoot
yerinecreatePortal
kullanın.
root.render(reactNode)
React root’un tarayıcı DOM düğümünde bir JSX parçası görüntülemek için root.render
çağrısı yapın.
root.render(<App />);
React, root
içinde <App />
gösterecek ve içindeki DOM’un yönetimini üstlenecektir.
Daha fazla örnek için aşağıya bakın.
Parametreler
reactNode
: Görüntülemek istediğiniz bir React düğümü. Bu genellikle<App />
gibi bir JSX parçası olacaktır, ancakcreateElement()
ile oluşturulmuş bir React elemanı, bir string, bir sayı,null
veyaundefined
da iletebilirsiniz.
Döndürülenler
root.render
undefined
değerini döndürür.
Uyarılar
-
İlk kez
root.render
fonksiyonunu çağırdığınız zaman React, React bileşenini render etmeden önce React kökü içindeki mevcut tüm HTML içeriğini temizleyecektir. -
Kök DOM düğümünüz sunucuda veya derleme sırasında React tarafından oluşturulan HTML içeriyorsa, bunun yerine olay işleyicilerini mevcut HTML’ye ekleyen
hydrateRoot()
fonksiyonunu kullanın. -
Aynı kök üzerinde birden fazla kez
render
çağrısı yaparsanız, React ilettiğiniz en son JSX’i yansıtmak için DOM’u gerektiği gibi güncelleyecektir. React, DOM’un hangi bölümlerinin yeniden kullanılabileceğine ve hangilerinin yeniden oluşturulması gerektiğine daha önce oluşturulmuş ağaçla “eşleştirerek” daha önce oluşturulmuş ağaçla karar verecektir. Aynı kök üzerinderender
fonksiyonunu tekrar çağırmak, kök bileşen üzerindeset
fonksiyonunu çağırmaya benzer: React gereksiz DOM güncellemelerinden kaçınır.
root.unmount()
React kökü içinde render edilmiş bir ağacı yok etmek için root.unmount
çağırın.
root.unmount();
Tamamen React ile oluşturulan bir uygulamada genellikle root.unmount
çağrısı olmayacaktır.
Bu, çoğunlukla React kök DOM düğümünüzün (veya atalarından herhangi birinin) başka bir kod tarafından DOM’dan kaldırılabileceği durumlarda kullanışlıdır. Örneğin, etkin olmayan sekmeleri DOM’dan kaldıran bir jQuery sekme paneli düşünün. Bir sekme kaldırılırsa, içindeki her şey (içindeki React kökleri de dahil olmak üzere) DOM’dan da kaldırılacaktır. Bu durumda, React’e root.unmount
çağrısı yaparak kaldırılan kökün içeriğini yönetmeyi “durdurmasını” söylemeniz gerekir. Aksi takdirde, kaldırılan kökün içindeki bileşenler, abonelikler gibi global kaynakları temizlemeyi ve boşaltmayı bilemez.
root.unmount
çağrısı, ağaçtaki tüm olay yöneticilerini veya state’i kaldırmak da dahil olmak üzere, kökteki tüm bileşenleri DOM’dan kaldıracak ve React’i kök DOM düğümünden “ayıracaktır”.
Parametreler
root.unmount
herhangi bir parametre kabul etmez.
Döndürülenler
root.unmount
undefined
döndürür.
Uyarılar
-
root.unmount
çağrısı, ağaçtaki tüm bileşenleri DOM’dan kaldıracak ve React’i kök DOM düğümünden “ayıracaktır”. -
Bir kez
root.unmount
çağrısı yaptığınızda, aynı kök üzerinde tekrarroot.render
çağrısı yapamazsınız. Bağlanmamış bir kök üzerinderoot.render
çağrılmaya çalışıldığında “Bağlanmamış bir kök güncellenemiyor” hatası verilir. Ancak, aynı DOM düğümü için önceki kökün bağlantısı kaldırıldıktan sonra yeni bir kök oluşturabilirsiniz.
Kullanım
Tamamen React ile oluşturulmuş bir uygulamayı render etmek
Eğer uygulamanız tamamen React ile oluşturulmuşsa, uygulamanızın tamamı için tek bir kök oluşturun.
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
Genellikle bu kodu başlangıçta yalnızca bir kez çalıştırmanız gerekir. Bu işlem şunları yapacaktır:
- HTML’nizde tanımlanan tarayıcı DOM düğümünü bulun.
- Uygulamanızın React bileşenini içinde görüntüleyin.
import { createRoot } from 'react-dom/client'; import App from './App.js'; import './styles.css'; const root = createRoot(document.getElementById('root')); root.render(<App />);
Eğer uygulamanız tamamen React ile oluşturulmuşsa, daha fazla kök oluşturmanız veya root.render
’ı tekrar çağırmanız gerekmez.
Bu noktadan itibaren React tüm uygulamanızın DOM’unu yönetecektir. Daha fazla bileşen eklemek için, bunları App
bileşeninin içine yerleştirin. Kullanıcı arayüzünü güncellemeniz gerektiğinde, bileşenlerinizin her biri bunu state kullanarak yapabilir. DOM düğümünün dışında bir modal veya araç ipucu gibi ekstra içerik görüntülemeniz gerektiğinde, bunu bir portal ile oluşturun.
Kısmen React ile oluşturulan bir sayfa render etmek
Sayfanız tamamen React ile oluşturulmamışsa, React tarafından yönetilen her bir üst düzey kullanıcı arayüzü parçası için bir kök oluşturmak üzere createRoot
öğesini birden çok kez çağırabilirsiniz. Her kökte root.render
çağrısı yaparak her kökte farklı içerikler görüntüleyebilirsiniz.
Burada, index.html dosyasında tanımlanan iki farklı DOM düğümüne iki farklı React bileşeni render edilmiştir:
import './styles.css'; import { createRoot } from 'react-dom/client'; import { Comments, Navigation } from './Components.js'; const navDomNode = document.getElementById('navigation'); const navRoot = createRoot(navDomNode); navRoot.render(<Navigation />); const commentDomNode = document.getElementById('comments'); const commentRoot = createRoot(commentDomNode); commentRoot.render(<Comments />);
Ayrıca document.createElement()
ile yeni bir DOM düğümü oluşturabilir ve bunu dokümana manuel olarak ekleyebilirsiniz.
const domNode = document.createElement('div');
const root = createRoot(domNode);
root.render(<Comment />);
document.body.appendChild(domNode); // Dokümanın herhangi bir yerine ekleyebilirsiniz
React ağacını DOM düğümünden kaldırmak ve onun tarafından kullanılan tüm kaynakları temizlemek için root.unmount
. çağırın.
root.unmount();
Bu, çoğunlukla React bileşenleriniz farklı bir çatıda yazılmış bir uygulamanın içindeyse kullanışlıdır.
Bir kök bileşenin güncellenmesi
Aynı kök üzerinde render
fonksiyonunu birden fazla kez çağırabilirsiniz. Önceki render edilen ile bileşen ağaç yapısı eşleştiği sürece, React state’i koruyacaktır.. Bu örnekte her saniyede tekrarlanan render
çağrılarından kaynaklanan güncellemelerin yıkıcı olmadığına dikkat edin. Örneğin girdi kutusuna yazı yazıyorsunuz:
import { createRoot } from 'react-dom/client'; import './styles.css'; import App from './App.js'; const root = createRoot(document.getElementById('root')); let i = 0; setInterval(() => { root.render(<App counter={i} />); i++; }, 1000);
Birden fazla kez render
çağrısı yapmak nadirdir. Genellikle bileşenleriniz bunun yerine state güncellemesi yapacaktır.
Yakalanmamış hatalar için bir diyaloğu gösterme
Varsayılan olarak, React tüm yakalanmamış hataları konsola kaydeder. Kendi hata raporlamanızı uygulamak için, isteğe bağlı onUncaughtError
root seçeneğini sağlayabilirsin:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onUncaughtError: (error, errorInfo) => {
console.error(
'Yakalanmamış hata',
error,
errorInfo.componentStack
);
}
}
);
root.render(<App />);
onUncaughtError seçeneği iki bağımsız değişkenle çağrılan bir fonksiyondur:
-
Fırlatılan hata.
-
Hatanın componentStack’ini içeren bir errorInfo nesnesi.
Hata diyalog pencerelerini görüntülemek için onUncaughtError
kök seçeneğini kullanabilirsin:
import { createRoot } from "react-dom/client"; import App from "./App.js"; import {reportUncaughtError} from "./reportError"; import "./styles.css"; const container = document.getElementById("root"); const root = createRoot(container, { onUncaughtError: (error, errorInfo) => { if (error.message !== 'Known error') { reportUncaughtError({ error, componentStack: errorInfo.componentStack }); } } }); root.render(<App />);
Hata yakalayıcı ile ilgili hataları görüntüleme
Varsayılan olarak, React bir Hata yakalayıcı tarafından yakalanan tüm hataları console.error
dosyasına kaydeder. Bu davranışı geçersiz kılmak için, bir Hata yakalayıcı tarafından yakalanan hataları işlemek üzere isteğe bağlı onCaughtError
kök seçeneğini sağlayabilirsin. Hata yakalayıcı:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onCaughtError: (error, errorInfo) => {
console.error(
'Yakalanan hata',
error,
errorInfo.componentStack
);
}
}
);
root.render(<App />);
onCaughtError seçeneği iki bağımsız değişkenle çağrılan bir fonksiyondur:
- Hata yakalayıcı tarafından yakalanan hata.
- Hatanın componentStack’ini içeren bir errorInfo nesnesi.
Hata diyologlarını görüntülemek veya bilinen hataları günlükten filtrelemek için onCaughtError
kök seçeneğini kullanabilirsin:
import { createRoot } from "react-dom/client"; import App from "./App.js"; import {reportCaughtError} from "./reportError"; import "./styles.css"; const container = document.getElementById("root"); const root = createRoot(container, { onCaughtError: (error, errorInfo) => { if (error.message !== 'Known error') { reportCaughtError({ error, componentStack: errorInfo.componentStack, }); } } }); root.render(<App />);
Kurtarılabilir hatalar için bir diyoloğu görüntüleme
React, render etme sırasında atılan bir hatadan kurtulmayı denemek için bir bileşeni otomatik olarak ikinci kez render edebilir. Başarılı olursa, React geliştiriciyi bilgilendirmek için konsola kurtarılabilir bir hata günlüğü kaydeder. Bu davranışı geçersiz kılmak için, isteğe bağlı onRecoverableError
kök seçeneğini sağlayabilirsin:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onRecoverableError: (error, errorInfo) => {
console.error(
'Kurtarılabilir hata',
error,
error.cause,
errorInfo.componentStack,
);
}
}
);
root.render(<App />);
onRecoverableError seçeneği iki bağımsız değişkenle çağrılan bir fonksiyondur:
-
React’in fırlattığı hata. Bazı hatalar, error.cause olarak orijinal nedeni içerebilir.
-
Hatanın componentStack’ini içeren bir errorInfo nesnesi.
Hata diyaloglarını görüntülemek için onRecoverableError
kök seçeneğini kullanabilirsin:
import { createRoot } from "react-dom/client"; import App from "./App.js"; import {reportRecoverableError} from "./reportError"; import "./styles.css"; const container = document.getElementById("root"); const root = createRoot(container, { onRecoverableError: (error, errorInfo) => { reportRecoverableError({ error, cause: error.cause, componentStack: errorInfo.componentStack, }); } }); root.render(<App />);
Sorun Giderme
Bir kök oluşturdum, fakat hiçbir şey görüntülenmiyor.
Uygulamanızı kök içine gerçekten render etmeyi unutmadığınızdan emin olun:
import { createRoot } from 'react-dom/client';
import App from './App.js';
const root = createRoot(document.getElementById('root'));
root.render(<App />);
Bunu yapana kadar hiçbir şey görüntülenmez.
Bir hata alıyorum: “root.render’a ikinci bir argüman geçtiniz”
Sık yapılan bir hata, createRoot
seçeneklerini root.render(...)
öğesine aktarmaktır:
Düzeltmek için, kök seçeneklerini root.render(...)
yerine createRoot(...)
öğesine aktarın:
// 🚩 Wrong: root.render only takes one argument.
root.render(App, {onUncaughtError});
// ✅ Correct: pass options to createRoot.
const root = createRoot(container, {onUncaughtError});
root.render(<App />);
Bir hata alıyorum: “Hedef kapsayıcı bir DOM öğesi değil”
Bu hata, createRoot
öğesine aktardığınız şeyin bir DOM düğümü olmadığı anlamına gelir.
Ne olduğundan emin değilseniz, yazdırmayı(log) deneyin:
const domNode = document.getElementById('root');
console.log(domNode); // ???
const root = createRoot(domNode);
root.render(<App />);
Örneğin, domNode
null
ise, getElementById
null
döndürmüş demektir. Bu, çağrınız sırasında dokümanda verilen kimliğe sahip bir düğüm yoksa gerçekleşir. Bunun birkaç nedeni olabilir:
- Aradığınız ID, HTML dosyasında kullandığınız ID’den farklı olabilir. Yazım hatalarını kontrol edin!
- Paketinizin
<script>
etiketi, HTML’de kendisinden sonra görünen herhangi bir DOM düğümünü “göremez”.
Bu hatayı almanın bir başka yaygın yolu da createRoot(domNode)
yerine createRoot(<App />)
yazmaktır.
Bir hata alıyorum: “Fonksiyonlar bir React alt elemanı olarak geçerli değildir.”
Bu hata, root.render
a aktardığınız şeyin bir React bileşeni olmadığı anlamına gelir.
Bu, root.render
öğesini <Component />
yerine Component
ile çağırırsanız meydana gelebilir:
// 🚩 Yanlış: App bir fonksiyondur, Bileşen değildir.
root.render(App);
// ✅ Doğru: <App /> bir bileşendir.
root.render(<App />);
Veya root.render
’a fonksiyonu çağırmanın sonucu yerine fonksiyonun kendisini iletirseniz:
// 🚩 Yanlış: createApp bir fonksiyondur, bileşen değildir.
root.render(createApp);
// ✅ Doğru: Bir bileşen döndürmek için createApp'i çağırın.
root.render(createApp());
Sunucu tarafından render edilen HTML’im sıfırdan yeniden oluşturuluyor
Uygulamanız sunucu tarafından render ediliyorsa ve React tarafından oluşturulan ilk HTML’yi içeriyorsa, bir kök oluşturmanın ve root.render
çağrısının tüm bu HTML’yi sildiğini ve ardından tüm DOM düğümlerini sıfırdan yeniden oluşturduğunu fark edebilirsiniz. Bu daha yavaş olabilir, odak ve kaydırma konumlarını sıfırlayabilir ve diğer kullanıcı girdilerini kaybedebilir.
Sunucu tarafından render edilen uygulamalar createRoot
yerine hydrateRoot
kullanmalıdır:
import { hydrateRoot } from 'react-dom/client';
import App from './App.js';
hydrateRoot(
document.getElementById('root'),
<App />
);
API’sinin farklı olduğunu unutmayın. Özellikle, başka bir root.render
çağrısı genellikle gerçekleşmeyecektir.