createRoot は、ブラウア�? DOM γƒŽγƒΌγƒ‰ε†…γ« React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½?γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γΎγ™γ€‚

const root = createRoot(domNode, options?)

γƒͺフゑレンス

createRoot(domNode, options?)

createRoot を呼び出して、ブラウア�? DOM θ¦η΄ ε†…γ«γ‚³γƒ³γƒ†γƒ³γƒ„γ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½? React γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γΎγ™γ€‚

import { createRoot } from 'react-dom/client';

const domNode = document.getElementById('root');
const root = createRoot(domNode);

React は domNode γ«ε―ΎεΏœγ™γ‚‹γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γ€γοΏ½?内部�? DOM γ‚’οΏ½?οΏ½η†γ—γΎγ™γ€‚γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γŸεΎŒγ€γοΏ½?内部に React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚γ« root.render γ‚’ε‘Όγ³ε‡Ίγ™εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

root.render(<App />);

React で�?οΏ½ε…¨γ«ζ§‹η―‰γ•γ‚ŒγŸγ‚’γƒ—γƒͺγ«γ―γ€γƒ«γƒΌγƒˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γŸγ‚οΏ½? createRoot ε‘Όγ³ε‡Ίγ—γŒι€šεΈΈ 1 ぀�?γΏε­˜εœ¨γ—γΎγ™γ€‚γƒšγƒΌγ‚Έε†…γ« React γ‚’γ€Œζ•£γ‚Šγ°γ‚γ¦γ€δ½Ώη”¨γ™γ‚‹γƒšγƒΌγ‚ΈοΏ½?ε ΄εˆγ―γ€εΏ…θ¦γͺだけ耇数�?γƒ«γƒΌγƒˆγ‚’ζŒγ€γ“γ¨γŒγ§γγΎγ™γ€‚

さらに例を見る

εΌ•ζ•°

  • domNode: DOM 要素。React はこ�? DOM θ¦η΄ γ«ε―ΎεΏœγ™γ‚‹γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γ€γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸ React γ‚³γƒ³γƒ†γƒ³γƒ„γ‚’θ‘¨η€Ίγ™γ‚‹γŸγ‚οΏ½? render γͺγ©γ€ι–’ζ•°γ‚’γƒ«γƒΌγƒˆδΈŠγ§ε‘Όγ³ε‡Ίγ›γ‚‹γ‚ˆγ†γ«γ—γΎγ™γ€‚

  • 省η•₯可能 options: こ�? React γƒ«γƒΌγƒˆγ«ι–’γ™γ‚‹γ‚ͺγƒ—γ‚·γƒ§γƒ³γŒε«γΎγ‚ŒγŸγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ€‚

    • 省η•₯可能 onRecoverableError: React がθ‡ͺε‹•ηš„γ«γ‚¨γƒ©γƒΌγ‹γ‚‰ε›žεΎ©γ—γŸγ¨γγ«ε‘Όγ³ε‡Ίγ•γ‚Œγ‚‹γ‚³γƒΌγƒ«γƒγƒƒγ‚―γ€‚
    • 省η•₯可能 identifierPrefix: React が useId γ«γ‚ˆγ£γ¦η”Ÿζˆγ™γ‚‹ ID γ«δ½Ώη”¨γ™γ‚‹ζ–‡ε­—εˆ—γƒ—γƒ¬γƒ•γ‚£γƒƒγ‚―γ‚Ήγ€‚εŒγ˜γƒšγƒΌγ‚ΈδΈŠγ«θ€‡ζ•°οΏ½?γƒ«γƒΌγƒˆγ‚’δ½Ώη”¨γ™γ‚‹ιš›γ«γ€η«Άεˆγ‚’ιΏγ‘γ‚‹γŸγ‚γ«η”¨γ„γΎγ™γ€‚

θΏ”γ‚Šε€€

createRoot は、render と unmount οΏ½? 2 ぀�?γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

注意点

  • γ‚’γƒ—γƒͺγŒγ‚΅γƒΌγƒγƒ¬γƒ³γƒ€γƒͺγƒ³γ‚°γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ€createRoot() οΏ½?δ½Ώη”¨γ―γ‚΅γƒγƒΌγƒˆγ•γ‚Œγ¦γ„γΎγ›γ‚“γ€‚δ»£γ‚γ‚Šγ« hydrateRoot() を使用してください。
  • γ‚’γƒ—γƒͺ内で createRoot を呼び出す�?γ―ι€šεΈΈ 1 ε›žγ γ‘γ§γ™γ€‚γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γ‚’δ½Ώη”¨γ—γ¦γ„γ‚‹ε ΄εˆγ€γ“οΏ½?ε‘Όγ³ε‡Ίγ—γ―γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γŒδ»£γ‚γ‚Šγ«θ‘Œγ†ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚
  • DOM ツγƒͺγƒΌε†…οΏ½?γ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?子ではγͺいεˆ₯οΏ½?ιƒ¨εˆ†γ« JSX γ‚’γƒ¬γƒ³γƒ€γƒΌγ—γŸγ„ε ΄εˆοΌˆδΎ‹γˆγ°γƒ’γƒΌγƒ€γƒ«γ‚„γƒ„γƒΌγƒ«γƒγƒƒγƒ—οΌ‰γ€createRoot οΏ½?δ»£γ‚γ‚Šγ« createPortal を使用してください。

root.render(reactNode)

root.render を呼び出して、React γƒ«γƒΌγƒˆοΏ½?ブラウア DOM γƒŽγƒΌγƒ‰γ« JSXοΌˆβ€œReact γƒŽγƒΌγƒ‰β€οΌ‰γ‚’θ‘¨η€Ίγ—γΎγ™γ€‚

root.render(<App />);

React は root に <App /> を葨瀺し、そ�?内部�? DOM οΏ½?οΏ½?οΏ½η†γ‚’θ‘Œγ„γΎγ™γ€‚

さらに例を見る

εΌ•ζ•°

  • reactNode: θ‘¨η€Ίγ—γŸγ„ React γƒŽγƒΌγƒ‰γ€‚ι€šεΈΈγ― <App /> οΏ½?γ‚ˆγ†γͺ JSX γ§γ™γŒγ€createElement() γ§ζ§‹η―‰γ—γŸ React θ¦η΄ γ‚„γ€ζ–‡ε­—εˆ—γ€ζ•°ε€€γ€nullγ€γΎγŸγ― undefined を渑すこともできます。

θΏ”γ‚Šε€€

root.render は undefined を返します。

注意点

  • root.render γ‚’εˆγ‚γ¦ε‘Όγ³ε‡Ίγ—γŸγ¨γγ€React は React γƒ«γƒΌγƒˆε†…οΏ½?ζ—’ε­˜οΏ½? HTML コンテンツをすべてクγƒͺをしてから、React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚

  • γƒ«γƒΌγƒˆοΏ½? DOM γƒŽγƒΌγƒ‰γŒγ‚΅γƒΌγƒγ‚„γƒ“γƒ«γƒ‰δΈ­γ« React γ«γ‚ˆγ£γ¦η”Ÿζˆγ•γ‚ŒγŸ HTML γ‚’ε«γ‚“γ§γ„γ‚‹ε ΄εˆγ―γ€ζ—’ε­˜οΏ½? HTML γ«γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γ‚’γ‚’γ‚Ώγƒƒγƒγ§γγ‚‹ hydrateRoot() を使用してください。

  • εŒγ˜γƒ«γƒΌγƒˆγ«ε―Ύγ—γ¦ render γ‚’θ€‡ζ•°ε›žε‘Όγ³ε‡Ίγ™γ¨γ€React γ―ζœ€ζ–°οΏ½? JSX γ‚’εζ˜ γ™γ‚‹γŸγ‚γ«εΏ…θ¦γͺだけ�? DOM οΏ½?ζ›΄ζ–°γ‚’θ‘Œγ„γΎγ™γ€‚React γ―γ€ζΈ‘γ•γ‚ŒγŸ JSX γ‚’δ»₯ε‰γ«γƒ¬γƒ³γƒ€γƒΌγ—γŸγƒ„γƒͺγƒΌγ¨γ€Œγƒžγƒƒγƒγƒ³γ‚°γ€γ—γ¦γ€DOM οΏ½?ど�?ιƒ¨εˆ†γŒε†εˆ©η”¨γ§γγ€γ©οΏ½?ιƒ¨εˆ†γ‚’ε†δ½œζˆγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹οΏ½?かを決�?οΏ½γ—γΎγ™γ€‚εŒγ˜γƒ«γƒΌγƒˆγ«ε―Ύγ—γ¦θ€‡ζ•°ε›ž render γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ€γƒ«γƒΌγƒˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§ set ι–’ζ•°γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ«δΌΌγ¦γŠγ‚Šγ€React は不必要γͺ DOM ζ›΄ζ–°γ‚’ε›žιΏγ—γΎγ™γ€‚


root.unmount()

root.unmount を呼び出して、React γƒ«γƒΌγƒˆε†…γ«γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγƒ„γƒͺーを破棄します。

root.unmount();

React で�?οΏ½ε…¨γ«ζ§‹η―‰γ•γ‚ŒγŸγ‚’γƒ—γƒͺγ«γ―γ€ι€šεΈΈγ€root.unmount οΏ½?ε‘Όγ³ε‡Ίγ—γ―δΈ€εˆ‡γ‚γ‚ŠγΎγ›γ‚“γ€‚

γ“γ‚Œγ―δΈ»γ«γ€React γƒ«γƒΌγƒˆοΏ½? DOM γƒŽγƒΌγƒ‰οΌˆγΎγŸγ―γοΏ½?η₯–ε…ˆοΏ½?γ„γšγ‚Œγ‹οΌ‰γŒδ»–οΏ½?γ‚³γƒΌγƒ‰γ«γ‚ˆγ£γ¦ DOM γ‹γ‚‰ε‰Šι™€γ•γ‚Œγ‚‹ε―θƒ½ζ€§γŒγ‚γ‚‹ε ΄εˆγ«ζœ‰η”¨γ§γ™γ€‚δΎ‹γˆγ°γ€ιžγ‚’γ‚―γƒ†γ‚£γƒ–γͺγ‚Ώγƒ–γ‚’ DOM γ‹γ‚‰ε‰Šι™€γ™γ‚‹ jQuery οΏ½?γ‚Ώγƒ–γƒ‘γƒγƒ«γŒγ‚γ‚‹γ¨ζƒ³εƒγ—γ¦γΏγ¦γγ γ•γ„γ€‚γ‚Ώγƒ–γŒε‰Šι™€γ•γ‚Œγ‚‹γ¨γ€οΌˆReact γƒ«γƒΌγƒˆγ‚’ε«γ‚“γ οΌ‰ε†…ιƒ¨οΏ½?γ™γΉγ¦γŒ DOM γ‹γ‚‰ε‰Šι™€γ•γ‚ŒγΎγ™γ€‚γοΏ½?ε ΄εˆγ€ε‰Šι™€γ•γ‚ŒγŸγƒ«γƒΌγƒˆοΏ½?コンテンツ�?οΏ½?οΏ½η†γ‚’γ€Œεœζ­’γ€γ™γ‚‹γ‚ˆγ† React γ«δΌγˆγ‚‹γŸγ‚γ« root.unmount γ‚’ε‘Όγ³ε‡Ίγ™εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γγ†γ—γͺγ„γ¨γ€ε‰Šι™€γ•γ‚ŒγŸγƒ«γƒΌγƒˆε†…οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―γ€γƒ‡γƒΌγ‚Ώθ³Όθͺ­γͺど�?グローバルγƒͺγ‚½γƒΌγ‚Ήγ‚’γ‚―γƒͺγƒΌγƒ³γ‚’γƒƒγƒ—γ—γ¦θ§£ζ”Ύγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹γ¨γ„γ†γ“γ¨γŒεˆ†γ‹γ‚‰γͺいままにγͺγ‚ŠγΎγ™γ€‚

root.unmount γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ§γ€γƒ«γƒΌγƒˆε†…οΏ½?すべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆγ•γ‚Œγ€React γŒγƒ«γƒΌγƒˆ DOM γƒŽγƒΌγƒ‰γ‹γ‚‰γ€Œεˆ‡γ‚Šι›’γ•γ‚Œγ€γΎγ™γ€‚γ“γ‚Œγ«γ―γ€γƒ„γƒͺγƒΌε†…οΏ½?γ‚€γƒ™γƒ³γƒˆγƒγƒ³γƒ‰γƒ©γ‚„ state οΏ½?ε‰Šι™€γ‚‚ε«γΎγ‚ŒγΎγ™γ€‚

εΌ•ζ•°

root.unmount γ―εΌ•ζ•°γ‚’ε—γ‘δ»˜γ‘γΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

root.unmount は undefined を返します。

注意点

  • root.unmount を呼び出すと、ツγƒͺγƒΌε†…οΏ½?すべて�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆγ•γ‚Œγ€React γŒγƒ«γƒΌγƒˆ DOM γƒŽγƒΌγƒ‰γ‹γ‚‰γ€Œεˆ‡γ‚Šι›’γ•γ‚Œγ€γΎγ™γ€‚

  • root.unmount γ‚’ε‘Όγ³ε‡Ίγ—γŸεΎŒγ€εŒδΈ€γƒ«γƒΌγƒˆγ§ε†εΊ¦ root.render γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ§γγΎγ›γ‚“γ€‚γ‚’γƒ³γƒžγ‚¦γƒ³γƒˆζΈˆγΏοΏ½?γƒ«γƒΌγƒˆγ§ root.render γ‚’ε‘Όγ³ε‡Ίγγ†γ¨γ™γ‚‹γ¨γ€β€œCannot update an unmounted root” γ¨γ„γ†γ‚¨γƒ©γƒΌγŒγ‚Ήγƒ­γƒΌγ•γ‚ŒγΎγ™γ€‚γŸγ γ—γ€γ‚γ‚‹ DOM γƒŽγƒΌγƒ‰γ«ε―Ύγ™γ‚‹δ»₯前�?γƒ«γƒΌγƒˆγŒγ‚’γƒ³γƒžγ‚¦γƒ³γƒˆγ•γ‚ŒγŸεΎŒγ§γ€εŒγ˜ DOM γƒŽγƒΌγƒ‰γ«ε―Ύγ—γ¦ζ–°γ—γ„γƒ«γƒΌγƒˆγ‚’δ½œζˆγ™γ‚‹γ“γ¨γ―ε―θƒ½γ§γ™γ€‚


使用法

React で�?οΏ½ε…¨γ«ζ§‹η―‰γ•γ‚ŒγŸγ‚’γƒ—γƒͺοΏ½?レンダー

γ‚’γƒ—γƒͺが�?�全に React γ§ζ§‹η―‰γ•γ‚Œγ¦γ„γ‚‹ε ΄εˆγ―γ€γ‚’γƒ—γƒͺ全体�?γŸγ‚οΏ½?ε˜δΈ€οΏ½?γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γΎγ™γ€‚

import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

ι€šεΈΈγ€γ“οΏ½?コードは衷動時に一度だけ�?οΏ½θ‘Œγ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ“οΏ½?コードはδ»₯δΈ‹οΏ½?γ“γ¨γ‚’θ‘Œγ„γΎγ™γ€‚

  1. HTML で�?οΏ½ηΎ©γ•γ‚Œγ¦γ„γ‚‹γƒ–γƒ©γ‚¦γ‚ΆοΏ½? DOM γƒŽγƒΌγƒ‰γ‚’θ¦‹γ€γ‘γΎγ™γ€‚
  2. γ‚’γƒ—γƒͺοΏ½? React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γοΏ½?内部に葨瀺します。
import { createRoot } from 'react-dom/client';
import App from './App.js';
import './styles.css';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

γ‚’γƒ—γƒͺが�?�全に React γ§ζ§‹η―‰γ•γ‚Œγ¦γ„γ‚‹ε ΄εˆγ€γ•γ‚‰γ«γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γŸγ‚Šγ€root.render γ‚’ε†εΊ¦ε‘Όγ³ε‡Ίγ—γŸγ‚Šγ™γ‚‹εΏ…θ¦γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚

こ�?時点から、React γŒγ‚’γƒ—γƒͺ全体�? DOM γ‚’οΏ½?οΏ½η†γ—γΎγ™γ€‚γ•γ‚‰γ«γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’θΏ½εŠ γ™γ‚‹γ«γ―γ€App γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?δΈ­γ«γƒγ‚Ήγƒˆγ—γΎγ™γ€‚UI γ‚’ζ›΄ζ–°γ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€ε„γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒ state γ‚’δ½Ώη”¨γ—γ¦θ‘Œγ„γΎγ™γ€‚γƒ’γƒΌγƒ€γƒ«γ‚„γƒ„γƒΌγƒ«γƒγƒƒγƒ—γͺど�?θΏ½εŠ γ‚³γƒ³γƒ†γƒ³γƒ„γ‚’γ“οΏ½? DOM γƒŽγƒΌγƒ‰οΏ½?ε€–ιƒ¨γ«θ‘¨η€Ίγ™γ‚‹εΏ…θ¦γŒγ‚γ‚‹ε ΄εˆγ€γƒγƒΌγ‚Ώγƒ«γ‚’δ½Ώγ£γ¦γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚

補袳

HTML が空�?ε ΄εˆγ€γ‚’γƒ—γƒͺοΏ½? JavaScript γ‚³γƒΌγƒ‰γŒθͺ­γΏθΎΌγΎγ‚Œγ¦οΏ½?οΏ½θ‘Œγ•γ‚Œγ‚‹γΎγ§γ€γƒ¦γƒΌγ‚Άγ«γ―η©Ίη™½οΏ½?γƒšγƒΌγ‚ΈγŒθ¦‹γˆηΆšγ‘γ‚‹γ“γ¨γ«γͺγ‚ŠγΎγ™γ€‚

<div id="root"></div>

γ“γ‚Œγ―ιžεΈΈγ«ι…γζ„Ÿγ˜γ‚‰γ‚Œγ‚‹γ“γ¨γŒγ‚γ‚ŠγΎγ™οΌ γ“γ‚Œγ‚’θ§£ζ±Ίγ™γ‚‹γŸγ‚γ«γ€γ‚΅γƒΌγƒγ‚΅γ‚€γƒ‰γ§γ€γ‚γ‚‹γ„γ―γƒ“γƒ«γƒ‰ζ™‚γ«εˆζœŸ HTML γ‚’γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰η”Ÿζˆγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€θ¨ͺ問者は JavaScript γ‚³γƒΌγƒ‰γŒθͺ­γΏθΎΌγΎγ‚Œγ‚‹ε‰γ«γƒ†γ‚­γ‚Ήγƒˆγ‚’θͺ­γ‚“γ γ‚Šγ€η”»εƒγ‚’θ¦‹γŸγ‚Šγ€γƒͺンクをクγƒͺγƒƒγ‚―γ—γŸγ‚Šγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚γ“οΏ½?ζœ€ι©εŒ–γ‚’θ‡ͺε‹•γ§θ‘Œγ†γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―οΏ½?δ½Ώη”¨γ‚’ζŽ¨ε₯¨γ—ます。�?οΏ½θ‘Œγ‚Ώγ‚€γƒŸγƒ³γ‚°γ«γ‚ˆγ‚Šγ€γ“οΏ½?ζŠ€θ‘“γ―γ‚΅γƒΌγƒγ‚΅γ‚€γƒ‰γƒ¬γƒ³γƒ€γƒͺング (server-side rendering; SSR) または ι™ηš„γ‚΅γ‚€γƒˆη”Ÿζˆ (static site generation; SSG) γ¨ε‘Όγ°γ‚ŒγΎγ™γ€‚

落とし穴

ァーバレンダγƒͺγƒ³γ‚°γΎγŸγ―ι™ηš„η”Ÿζˆγ‚’δ½Ώη”¨γ™γ‚‹γ‚’γƒ—γƒͺは、createRoot οΏ½?δ»£γ‚γ‚Šγ« hydrateRoot γ‚’ε‘Όγ³ε‡Ίγ™εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚Œγ«γ‚ˆγ‚Š React は、HTML γ«ζ›Έγ‹γ‚ŒγŸ DOM γƒŽγƒΌγƒ‰γ‚’η ΄ζ£„γ—γ¦ε†δ½œζˆγ™γ‚‹οΏ½?ではγͺγγ€γƒγ‚€γƒ‰γƒ¬γƒΌγ‚·γƒ§γƒ³οΌˆε†εˆ©η”¨οΌ‰γ™γ‚‹γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚


React γ§ιƒ¨εˆ†ηš„γ«ζ§‹η―‰γ•γ‚ŒγŸγƒšγƒΌγ‚ΈοΏ½?レンダー

γƒšγƒΌγ‚ΈγŒοΏ½?�全には React γ§ζ§‹η―‰γ•γ‚Œγ¦γ„γͺγ„ε ΄εˆγ€createRoot γ‚’θ€‡ζ•°ε›žε‘Όγ³ε‡Ίγ—γ¦γ€React に�?οΏ½η†γ•γ›γŸγ„γƒˆγƒƒγƒ—γƒ¬γƒ™γƒ«οΏ½?各 UI γƒ‘γƒΌγƒ„γ«ε―Ύγ—γ¦γƒ«γƒΌγƒˆγ‚’δ½œζˆγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚ε„γƒ«γƒΌγƒˆγ§ root.render γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ€γγ‚Œγžγ‚Œγ«η•°γͺγ‚‹γ‚³γƒ³γƒ†γƒ³γƒ„γ‚’θ‘¨η€Ίγ™γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

δ»₯下では、index.html フゑむルに�?οΏ½ηΎ©γ•γ‚Œγ¦γ„γ‚‹ 2 ぀�?η•°γͺγ‚‹ DOM γƒŽγƒΌγƒ‰γ« 2 ぀�?η•°γͺγ‚‹ React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ¦γ„γΎγ™γ€‚

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 />);

γΎγŸγ€document.createElement() を使用して新しい DOM γƒŽγƒΌγƒ‰γ‚’δ½œζˆγ—γ€γγ‚Œγ‚’ζ‰‹ε‹•γ§γƒ‰γ‚­γƒ₯γƒ‘γƒ³γƒˆγ«θΏ½εŠ γ™γ‚‹γ“γ¨γ‚‚γ§γγΎγ™γ€‚

const domNode = document.createElement('div');
const root = createRoot(domNode);
root.render(<Comment />);
document.body.appendChild(domNode); // You can add it anywhere in the document

DOM γƒŽγƒΌγƒ‰γ‹γ‚‰ React ツγƒͺγƒΌγ‚’ε‰Šι™€γ—γ€γγ‚Œγ«γ‚ˆγ£γ¦δ½Ώη”¨γ•γ‚ŒγŸγ™γΉγ¦οΏ½?γƒͺγ‚½γƒΌγ‚Ήγ‚’γ‚―γƒͺーンをップするには、root.unmount を呼び出します。

root.unmount();

γ“γ‚Œγ―δΈ»γ«γ€React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒεˆ₯οΏ½?γƒ•γƒ¬γƒΌγƒ γƒ―γƒΌγ‚―γ§ζ›Έγ‹γ‚ŒγŸγ‚’γƒ—γƒͺοΏ½?δΈ­γ«γ‚γ‚‹ε ΄εˆγ«ε½Ήη«‹γ‘γΎγ™γ€‚


γƒ«γƒΌγƒˆγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?ζ›΄ζ–°

εŒγ˜γƒ«γƒΌγƒˆγ«ε―Ύγ—γ¦ render γ‚’θ€‡ζ•°ε›žε‘Όγ³ε‡Ίγ™γ“γ¨γŒγ§γγΎγ™γ€‚γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγƒ„γƒͺγƒΌοΏ½?ζ§‹ι€ γŒδ»₯ε‰γ«γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‚‚οΏ½?γ¨δΈ€θ‡΄γ—γ¦γ„γ‚Œγ°γ€React は state γ‚’δΏζŒγ—γΎγ™γ€‚δ»₯δΈ‹οΏ½?例でε…₯εŠ›γƒ•γ‚£γƒΌγƒ«γƒ‰γ«γ‚Ώγ‚€γƒ—γ§γγ‚‹γ“γ¨γ«η€οΏ½?γ—γ¦γγ γ•γ„γ€‚γ€γΎγ‚Šζ―Žη§’ render γŒηΉ°γ‚ŠθΏ”γ—ε‘Όγ³ε‡Ίγ•γ‚Œγ¦γ„γΎγ™γŒγ€ζ›΄ζ–°γ«γ‚ˆγ‚Š DOM γŒη ΄ε£Šγ•γ‚Œγ¦γ„γͺいということです。

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);

render γ‚’θ€‡ζ•°ε›žε‘Όγ³ε‡Ίγ™γ“γ¨γ―ζ»…ε€šγ«γ‚γ‚ŠγΎγ›γ‚“γ€‚ι€šεΈΈγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―δ»£γ‚γ‚Šγ« state οΏ½?ζ›΄ζ–°γ‚’θ‘Œγ„γΎγ™γ€‚


γƒˆγƒ©γƒ–γƒ«γ‚·γƒ₯ーティング

γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γŸγŒδ½•γ‚‚θ‘¨η€Ίγ•γ‚Œγͺい

γ‚’γƒ—γƒͺγ‚’οΏ½?οΏ½ιš›γ«γƒ«γƒΌγƒˆγ«γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹οΏ½?γ‚’εΏ˜γ‚Œγ¦γ„γͺいか璺θͺγ—てください。

import { createRoot } from 'react-dom/client';
import App from './App.js';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

γ“γ‚Œγ‚’θ‘Œγ†γΎγ§γ―δ½•γ‚‚θ‘¨η€Ίγ•γ‚ŒγΎγ›γ‚“γ€‚


β€œTarget container is not a DOM element” γ¨γ„γ†γ‚¨γƒ©γƒΌγŒε‡Ίγ‚‹

こ�?エラーは、createRoot に渑しているも�?が DOM γƒŽγƒΌγƒ‰γ§γͺいことを意味します。

δ½•γŒθ΅·γ“γ£γ¦γ„γ‚‹οΏ½?かわからγͺγ„ε ΄εˆγ―γ€γƒ­γ‚°γ‚’ε‡ΊεŠ›γ—γ¦γΏγ¦γγ γ•γ„γ€‚

const domNode = document.getElementById('root');
console.log(domNode); // ???
const root = createRoot(domNode);
root.render(<App />);

δΎ‹γˆγ°γ€domNode が null οΏ½?ε ΄εˆγ€getElementById が null γ‚’θΏ”γ—γŸγ“γ¨γ‚’ζ„ε‘³γ—γΎγ™γ€‚γ“γ‚Œγ―γ€ε‘Όγ³ε‡Ίγ—ζ™‚η‚Ήγ§γƒ‰γ‚­γƒ₯γƒ‘γƒ³γƒˆε†…γ«ζŒ‡οΏ½?οΏ½γ—γŸ ID οΏ½?γƒŽγƒΌγƒ‰γŒε­˜εœ¨γ—γͺγ„ε ΄εˆγ«η™Ίη”Ÿγ—γΎγ™γ€‚γ“γ†γͺγ‚‹η†η”±γ―γ„γγ€γ‹θ€ƒγˆγ‚‰γ‚ŒγΎγ™γ€‚

  1. ζŽ’γ—γ¦γ„γ‚‹ ID が HTML γƒ•γ‚‘γ‚€γƒ«γ§δ½Ώη”¨γ—γŸ ID と異γͺγ£γ¦γ„γ‚‹γ€‚γ‚Ώγ‚€γƒ—γƒŸγ‚Ήγ‚’γƒγ‚§γƒƒγ‚―γ—γ¦γγ γ•γ„οΌ
  2. DOM γƒŽγƒΌγƒ‰γŒγƒγƒ³γƒ‰γƒ«οΏ½? <script> γ‚Ώγ‚°γ‚ˆγ‚ŠεΎŒγ‚γ«γ‚γ‚‹γŸγ‚γ€γ‚Ήγ‚―γƒͺγƒ—γƒˆγ‹γ‚‰γ€Œθ¦‹γˆγ€γͺい。

こ�?γ‚¨γƒ©γƒΌγŒη™Ίη”Ÿγ™γ‚‹γ‚‚γ†γ²γ¨γ€οΏ½?δΈ€θˆ¬ηš„γͺ理由は、createRoot(domNode) ではγͺく createRoot(<App />) と書いてしまっていることです。


β€œFunctions are not valid as a React child.” γ¨γ„γ†γ‚¨γƒ©γƒΌγŒε‡Ίγ‚‹

こ�?エラーは、root.render に渑しているも�?が React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γͺいことを意味します。

γ“γ‚Œγ―γ€root.render γ‚’ <Component /> ではγͺく Component οΏ½?γ‚ˆγ†γ«ε‘Όγ³ε‡Ίγ—γŸε ΄εˆγ«η™Ίη”Ÿγ™γ‚‹γ“γ¨γŒγ‚γ‚ŠγΎγ™γ€‚

// 🚩 Wrong: App is a function, not a Component.
root.render(App);

// βœ… Correct: <App /> is a component.
root.render(<App />);

γΎγŸγ―γ€root.render γ«ι–’ζ•°γ‚’ε‘Όγ³ε‡Ίγ—γŸη΅ζžœγ§γ―γͺく閒数θ‡ͺδ½“γ‚’ζΈ‘γ—γ¦γ—γΎγ£γŸε ΄εˆγ«γ‚‚η™Ίη”Ÿγ—γΎγ™γ€‚

// 🚩 Wrong: createApp is a function, not a component.
root.render(createApp);

// βœ… Correct: call createApp to return a component.
root.render(createApp());

ァーバレンダγƒͺγƒ³γ‚°γ•γ‚ŒγŸ HTML γŒε†δ½œζˆγ•γ‚Œγ‚‹

γ‚’γƒ—γƒͺγŒγ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹ε½’εΌγ§γ‚γ‚Šγ€React γ«γ‚ˆγ£γ¦η”Ÿζˆγ•γ‚ŒγŸεˆζœŸ HTML γŒγ‚γ‚‹ε ΄εˆγ€γƒ«γƒΌγƒˆγ‚’δ½œζˆγ—γ¦ root.render を呼び出すと、そ�? HTML γŒγ™γΉγ¦ε‰Šι™€γ•γ‚Œγ¦ DOM γƒŽγƒΌγƒ‰γŒγ‚Όγƒ­γ‹γ‚‰ε†δ½œζˆγ•γ‚Œγ‚‹γ“γ¨γ«ζ°—δ»˜γ‹γ‚Œγ‚‹γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šε‡¦η†γŒι…γγͺγ‚Šγ€γƒ•γ‚©γƒΌγ‚«γ‚Ήγ‚„γ‚Ήγ‚―γƒ­γƒΌγƒ«δ½οΏ½?がγƒͺγ‚»γƒƒγƒˆγ•γ‚Œγ€γƒ¦γƒΌγ‚Άε…₯εŠ›γŒε€±γ‚γ‚Œγ‚‹ε―θƒ½ζ€§γŒγ‚γ‚ŠγΎγ™γ€‚

γ‚΅γƒΌγƒγ§γƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‚’γƒ—γƒͺは、createRoot οΏ½?δ»£γ‚γ‚Šγ« hydrateRoot γ‚’δ½Ώη”¨γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

import { hydrateRoot } from 'react-dom/client';
import App from './App.js';

hydrateRoot(
document.getElementById('root'),
<App />
);

API γŒη•°γͺγ‚‹γ“γ¨γ«ζ³¨ζ„γ—γ¦γγ γ•γ„γ€‚η‰Ήγ«γ€ι€šεΈΈγ―γ“οΏ½?εΎŒγ•γ‚‰γ« root.render γ‚’ε‘Όγ³ε‡Ίγ™γ“γ¨γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚