hydrate
hydrate
, React 17 ve altındaki sürümlerde, HTML içeriği daha önce react-dom/server
tarafından oluşturulmuş olan bir tarayıcı DOM düğümü içinde React bileşenlerini görüntülemenizi sağlar.
hydrate(reactNode, domNode, callback?)
Başvuru
hydrate(reactNode, domNode, callback?)
React 17 ve altındaki sürümlerde, hydrate
çağrısı yaparak React’i sunucu ortamında zaten render edilmiş olan mevcut HTML’ye “bağlayabilirsiniz”.
import { hydrate } from 'react-dom';
hydrate(reactNode, domNode);
React, domNode
içinde var olan HTML’ye bağlanacak ve içindeki DOM’u yönetmeye başlayacaktır. Tamamen React ile oluşturulmuş bir uygulama genellikle kök bileşeniyle yalnızca bir hydrate
çağrısına sahip olacaktır.
Aşağıda daha fazla örnek görün.
Parametreler
-
reactNode
: Mevcut HTML’yi render etmek için kullanılan “React düğümü”. Bu genellikle React 17’derenderToString(<App />)
gibi birReactDOM Server
yöntemi ile render edilmiş<App />
gibi bir JSX parçası olacaktır. -
domNode
: Sunucuda kök eleman olarak render edilmiş bir DOM elemanı. -
isteğe bağlı:
callback
: Eğer geçilirse, bileşeniniz hydrate edildikten sonra React bu fonksiyonu çağıracaktır.
Dönen Değerler
hydrate
null döner.
Uyarılar
hydrate
, render edilmiş içeriğin sunucu tarafından render edilen içerikle aynı olmasını bekler. React, metin içeriğindeki farklılıkları düzeltebilir, ancak uyumsuzlukları hatalar olarak görmeli ve düzeltmelisiniz.- Geliştirme modunda, React, hydrate işlemi sırasında uyumsuzluklar hakkında uyarır. Uyumsuzluk durumunda özellik farklılıklarının düzeltileceği garantisi yoktur. Bu, performans nedenleriyle önemlidir çünkü çoğu uygulamada, uyumsuzluklar nadirdir ve bu nedenle tüm işaretlemeyi doğrulamak aşırı derecede pahalı olurdu.
- Uygulamanızda muhtemelen yalnızca bir
hydrate
çağrısı olacaktır. Bir çatı kullanıyorsanız, bu çağrıyı sizin için yapabilir. - Uygulamanızda önceden render edilmiş HTML olmadan yalnızca istemci tarafından render edilmişse,
hydrate()
kullanımı desteklenmez. Bunun yerine render() (React 17 ve altı için) veya createRoot() (React 18+ için) kullanın.
Kullanım
Bir React bileşenini bir sunucu-render tarayıcı DOM düğümüne bağlamak için hydrate
çağrısı yapın.
import { hydrate } from 'react-dom';
hydrate(<App />, document.getElementById('root'));
Yalnızca istemci için bir uygulamayı (önceden sunucuda render edilmemiş bir uygulamayı) render etmek için hydrate()
kullanımı desteklenmez. Bunun yerine render()
(React 17 ve altı için) veya createRoot()
(React 18+ için) kullanın.
Sunucuda render edilmiş HTML’yi hydrate etme
React’te, “hydration”, React’in bir sunucu ortamında zaten render edilmiş olan mevcut HTML’ye “bağlanması” anlamına gelir. Hydration sırasında, React mevcut işaretlemeye olay dinleyicilerini bağlamaya çalışır ve uygulamayı istemcide render etmeyi devralır.
Tamamen React ile oluşturulmuş uygulamalarda, genellikle tüm uygulamanız için başlangıçta yalnızca bir “kök” hydrate edersiniz.
import './styles.css'; import { hydrate } from 'react-dom'; import App from './App.js'; hydrate(<App />, document.getElementById('root'));
Genellikle hydrate
çağrısını başka bir yerde tekrar yapmanız veya çağırmanız gerekmez. Bu noktadan itibaren, React uygulamanızın DOM’unu yönetiyor olacaktır. UI’yi güncellemek için bileşenleriniz state kullanacaktır.
Hydration hakkında daha fazla bilgi için, hydrateRoot
belgelerine bakın.
Kaçınılmaz hydration uyumsuzluk hatalarını bastırma
Sunucu ve istemci arasındaki bir elemanın özelliği veya metin içeriği kaçınılmaz olarak farklıysa (örneğin, bir zaman damgası), hydrate uyumsuzluk uyarısını bastırabilirsiniz.
Bir elemandaki hydrate uyarılarını bastırmak için suppressHydrationWarning={true}
ekleyin:
export default function App() { return ( <h1 suppressHydrationWarning={true}> Current Date: {new Date().toLocaleDateString()} </h1> ); }
Bu yalnızca bir seviye derinlikte çalışır ve bir kaçış yolu olarak tasarlanmıştır. Fazla kullanmayın. Metin içeriği olmadıkça, React yine de bunu düzeltmeye çalışmaz, bu nedenle gelecekteki güncellemelere kadar tutarsız kalabilir.
Farklı istemci ve sunucu içeriğini yönetme
İstemcide ve sunucuda kasıtlı olarak farklı bir şey render etmeniz gerekiyorsa, iki geçişli render yapabilirsiniz. İstemcide farklı bir şey render eden bileşenler, isClient
gibi bir state değişkeni okuyabilir ve bu değişkeni bir Effect içinde true
olarak ayarlayabilirsiniz:
import { useState, useEffect } from "react"; export default function App() { const [isClient, setIsClient] = useState(false); useEffect(() => { setIsClient(true); }, []); return ( <h1> {isClient ? 'Is Client' : 'Is Server'} </h1> ); }
Bu şekilde, ilk render geçişi sunucudaki içeriği aynı şekilde render eder, uyumsuzluklardan kaçınır, ancak hydrate işleminden hemen sonra ek bir geçiş daha gerçekleşir.