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.
- I’m getting an error: “You passed a second argument to root.render”
- 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 optional
onCaughtError
: Callback called when React catches an error in an Error Boundary. Called with theerror
caught by the Error Boundary, and anerrorInfo
object containing thecomponentStack
. - Canary only optional
onUncaughtError
: Callback called when an error is thrown and not caught by an Error Boundary. Called with theerror
that was thrown, and anerrorInfo
object containing thecomponentStack
. - optional
onRecoverableError
: React’in hatalardan otomatik olarak kurtulduğunda çağrılan callback fonksiyonu. Called with anerror
React throws, and anerrorInfo
object containing thecomponentStack
. Some recoverable errors may include the original error cause aserror.cause
. - 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 optional
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.
Show a dialog for uncaught errors
By default, React will log all uncaught errors to the console. To implement your own error reporting, you can provide the optional onUncaughtError
root option:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onUncaughtError: (error, errorInfo) => {
console.error(
'Uncaught error',
error,
errorInfo.componentStack
);
}
}
);
root.render(<App />);
The onUncaughtError option is a function called with two arguments:
- The error that was thrown.
- An errorInfo object that contains the componentStack of the error.
You can use the onUncaughtError
root option to display error dialogs:
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 />);
Displaying Error Boundary errors
By default, React will log all errors caught by an Error Boundary to console.error
. To override this behavior, you can provide the optional onCaughtError
root option to handle errors caught by an Error Boundary:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onCaughtError: (error, errorInfo) => {
console.error(
'Caught error',
error,
errorInfo.componentStack
);
}
}
);
root.render(<App />);
The onCaughtError option is a function called with two arguments:
- The error that was caught by the boundary.
- An errorInfo object that contains the componentStack of the error.
You can use the onCaughtError
root option to display error dialogs or filter known errors from logging:
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 />);
Displaying a dialog for recoverable errors
React may automatically render a component a second time to attempt to recover from an error thrown in render. If successful, React will log a recoverable error to the console to notify the developer. To override this behavior, you can provide the optional onRecoverableError
root option:
import { createRoot } from 'react-dom/client';
const root = createRoot(
document.getElementById('root'),
{
onRecoverableError: (error, errorInfo) => {
console.error(
'Recoverable error',
error,
error.cause,
errorInfo.componentStack,
);
}
}
);
root.render(<App />);
The onRecoverableError option is a function called with two arguments:
- The error that React throws. Some errors may include the original cause as error.cause.
- An errorInfo object that contains the componentStack of the error.
You can use the onRecoverableError
root option to display error dialogs:
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.
I’m getting an error: “You passed a second argument to root.render”
A common mistake is to pass the options for createRoot
to root.render(...)
:
To fix, pass the root options to createRoot(...)
, not root.render(...)
:
// 🚩 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.