createElement γ«γ‚ˆγ£γ¦ React θ¦η΄ γ‚’δ½œζˆγ§γγΎγ™γ€‚γ“γ‚Œγ― JSX γ‚’ζ›Έγδ»£γ‚γ‚ŠοΏ½?手�?οΏ½γ¨γ—γ¦εˆ©η”¨γ§γγΎγ™γ€‚

const element = createElement(type, props, ...children)

γƒͺフゑレンス

createElement(type, props, ...children)

createElement γ‚’ε‘Όγ³ε‡Ίγ—γ¦γ€ζŒ‡οΏ½?οΏ½γ—γŸ type、props、children γ‚’ζŒγ£γŸ React θ¦η΄ γ‚’δ½œζˆγ—γΎγ™γ€‚

import { createElement } from 'react';

function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}

さらに例を見る

εΌ•ζ•°

  • type: type εΌ•ζ•°γ―ζœ‰εŠΉγͺ React οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆεž‹γ§γͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚δΎ‹γˆγ°γ€γ‚Ώγ‚°εοΏ½?ζ–‡ε­—εˆ—οΌˆ'div' γ‚„ 'span')や、React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΌˆι–’ζ•°γ€γ‚―γƒ©γ‚Ήγ€γΎγŸγ― Fragment οΏ½?γ‚ˆγ†γͺη‰Ήεˆ₯γͺγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΌ‰γŒθ©²ε½“γ—γΎγ™γ€‚

  • props: props 引数はγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‹ null でγͺγ‘γ‚Œγ°γͺγ‚ŠγΎγ›γ‚“γ€‚null を渑すと、空�?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ¨εŒγ˜γ‚ˆγ†γ«ζ‰±γ‚γ‚ŒγΎγ™γ€‚React γ―γ€ζΈ‘γ•γ‚ŒγŸ props と同じ props γ‚’ζŒγ£γŸθ¦η΄ γ‚’δ½œζˆγ—γΎγ™γ€‚props γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΏ½? ref と key は特εˆ₯γ§γ‚γ‚Šγ€θΏ”γ•γ‚ŒγŸ element οΏ½? element.props.ref γ‚„ element.props.key γ¨γ—γ¦εˆ©η”¨γ§γγΎγ›γ‚“γ€‚element.ref γͺいし element.key とγͺγ‚ŠγΎγ™γ€‚

  • 省η•₯可能 ...children: ゼロ個δ»₯上�?ε­γƒŽγƒΌγƒ‰γ€‚γ“γ‚Œγ‚‰γ― React γƒŽγƒΌγƒ‰γ€γ€γΎγ‚Šγ€React θ¦η΄ γ€ζ–‡ε­—εˆ—γ€ζ•°ε€€γ€γƒγƒΌγ‚Ώγƒ«γ€η©ΊγƒŽγƒΌγƒ‰οΌˆnull、undefined、true、false)、あるいは React γƒŽγƒΌγƒ‰οΏ½?ι…εˆ—γ¨γͺγ‚ŠγΎγ™γ€‚

θΏ”γ‚Šε€€

createElement はδ»₯δΈ‹οΏ½?γƒ—γƒ­γƒ‘γƒ†γ‚£γ‚’ζŒγ€ React 要素γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’θΏ”γ—γΎγ™γ€‚

  • type: ζŒ‡οΏ½?οΏ½γ—γŸ type。
  • props: ζŒ‡οΏ½?οΏ½γ—γŸ propsγ€γŸγ γ— ref と key は陀く。もし type γŒγƒ¬γ‚¬γ‚·γƒΌοΏ½? type.defaultProps γ‚’ζŒγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ§γ‚γ‚Œγ°γ€ζ¬ γ‘γ¦γ„γ‚‹γ‹ undefined とγͺっている props は type.defaultProps から倀を取得します。
  • ref: ζŒ‡οΏ½?οΏ½γ—γŸ ref。ζœͺζŒ‡οΏ½?οΏ½οΏ½?場合は null。
  • key: ζŒ‡οΏ½?οΏ½γ—γŸ keyγ€‚εΌ·εˆΆηš„γ«ζ–‡ε­—εˆ—γ«ε€‰ζ›γ•γ‚ŒγΎγ™γ€‚ζœͺζŒ‡οΏ½?οΏ½οΏ½?場合は null。

ι€šεΈΈγ€γ“οΏ½?θ¦η΄ γ‚’γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰θΏ”γ™γ‹γ€δ»–οΏ½?要素�?子として用います。要素�?プロパティをθͺ­γΏε–γ‚‹γ“γ¨γ―ε―θƒ½γ§γ™γŒγ€δ½œζˆεΎŒγ―θ¦η΄ οΏ½?ζ§‹ι€ γ‚’ιžε…¬ι–‹ (opaque) として扱い、レンダー�?γΏθ‘Œγ†γ‚ˆγ†γ«γ™γ‚‹γΉγγ§γ™γ€‚

注意点

  • React 要素とそ�? props γ―γ‚€γƒŸγƒ₯ータブル (immutable) γ¨γ—γ¦ζ‰±γ„γ€δ½œζˆεΎŒγ«γοΏ½?ε†…οΏ½?�を倉更してはγͺγ‚ŠγΎγ›γ‚“γ€‚γ“γ‚Œγ‚’εΌ·εˆΆγ™γ‚‹γŸγ‚γ«γ€React γ―ι–‹η™Ίη’°ε’ƒγ«γŠγ„γ¦γ€θΏ”γ•γ‚ŒγŸθ¦η΄ γ¨γοΏ½? props プロパティを桅く凍硐 (freeze) します。

  • JSX γ‚’δ½Ώη”¨γ™γ‚‹ε ΄εˆγ€η‹¬θ‡ͺοΏ½?γ‚«γ‚Ήγ‚Ώγƒ γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γŸγ‚γ«γ―γ‚Ώγ‚°γ‚’ε€§ζ–‡ε­—γ§ε§‹γ‚γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ€γΎγ‚Šγ€<Something /> は createElement(Something) γ¨εŒη­‰γ§γ™γŒγ€<something />οΌˆε°ζ–‡ε­—οΌ‰γ― createElement('something') γ¨εŒη­‰γ§γ™οΌˆζ–‡ε­—εˆ—γͺοΏ½?で、硄み込み�? HTML γ‚Ώγ‚°γ¨γ—γ¦ζ‰±γ‚γ‚ŒγΎγ™οΌ‰γ€‚

  • 耇数�?子�?ε†…οΏ½?οΏ½γŒγ™γΉγ¦ι™ηš„γ«εˆ†γ‹γ£γ¦γ„γ‚‹ε ΄εˆγ€createElement には子を createElement('h1', {}, child1, child2, child3) οΏ½?γ‚ˆγ†γ«θ€‡ζ•°οΏ½?εΌ•ζ•°γ¨γ—γ¦ζΈ‘γ—γ¦γγ γ•γ„γ€‚ε­γŒε‹•ηš„γͺε ΄εˆγ―γ€ι…εˆ—ε…¨δ½“γ‚’η¬¬ 3 引数として createElement('ul', {}, listItems) οΏ½?γ‚ˆγ†γ«ζΈ‘γ—γ¦γγ γ•γ„γ€‚γ“γ‚Œγ«γ‚ˆγ‚Šγ€React γ―ε‹•ηš„γͺγƒͺγ‚Ήγƒˆγ« key γŒζ¬ γ‘γ¦γ„γ‚‹ε ΄εˆγ«θ­¦ε‘Šγ‚’ε‡Ίγ™γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚ι™ηš„γͺγƒͺγ‚Ήγƒˆγ§γ―δΈ¦γ³ζ›Ώγˆγ―ζ±Ίγ—γ¦η™Ίη”Ÿγ—γͺγ„γŸγ‚γ€key γ―εΏ…θ¦γ‚γ‚ŠγΎγ›γ‚“γ€‚


使用法

JSX γ‚’δ½Ώγ‚γšγ«θ¦η΄ γ‚’δ½œζˆγ™γ‚‹

JSX がε₯½γγ§γͺγ„ε ΄εˆγ‚„γ€γƒ—γƒ­γ‚Έγ‚§γ‚―γƒˆγ§δ½Ώη”¨γ§γγͺγ„ε ΄εˆγ«γ―γ€δ»£γ‚γ‚Šγ« createElement を使用できます。

JSX γ‚’δ½Ώγ‚γšγ«θ¦η΄ γ‚’δ½œζˆγ™γ‚‹γ«γ―γ€createElement を呼び出して、何らか�? type、props、children を引数として渑します。

import { createElement } from 'react';

function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}

children はγ‚ͺプションで、必要γͺγ γ‘ζΈ‘γ™γ“γ¨γŒγ§γγΎγ™οΌˆδΈŠθ¨˜οΏ½?δΎ‹γ§γ―ε­γŒ 3 γ€γ‚γ‚ŠγΎγ™οΌ‰γ€‚γ“οΏ½?コードは、<h1> γƒ˜γƒƒγƒ€γ«ζŒ¨ζ‹Άζ–‡ε­—εˆ—γ‚’ε…₯γ‚Œγ¦θ‘¨η€Ίγ—γΎγ™γ€‚ζ―”θΌƒοΏ½?γŸγ‚γ€δ»₯下に JSX γ‚’δ½Ώγ£γ¦ζ›Έγη›΄γ—γŸεŒγ˜δΎ‹γ‚’η€Ίγ—γΎγ™γ€‚

function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}

θ‡ͺθΊ«οΏ½?γ‚«γ‚Ήγ‚Ώγƒ  React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ«γ―γ€'h1' οΏ½?γ‚ˆγ†γͺζ–‡ε­—εˆ—γ§γ―γͺく Greeting οΏ½?γ‚ˆγ†γͺι–’ζ•°γ‚’ type として渑します。

export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}

JSX γ‚’δ½Ώη”¨γ—γŸε ΄εˆγ―δ»₯δΈ‹οΏ½?γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚

export default function App() {
return <Greeting name="Taylor" />;
}

δ»₯下は、createElement γ‚’δ½Ώη”¨γ—γ¦ζ›Έγ‹γ‚ŒγŸγƒ•γƒ«οΏ½?ァンプルです。

import { createElement } from 'react';

function Greeting({ name }) {
  return createElement(
    'h1',
    { className: 'greeting' },
    'Hello ',
    createElement('i', null, name),
    '. Welcome!'
  );
}

export default function App() {
  return createElement(
    Greeting,
    { name: 'Taylor' }
  );
}

εŒγ˜γ‚‚οΏ½?γ‚’ JSX で書くとδ»₯δΈ‹οΏ½?γ‚ˆγ†γ«γͺγ‚ŠγΎγ™γ€‚

function Greeting({ name }) {
  return (
    <h1 className="greeting">
      Hello <i>{name}</i>. Welcome!
    </h1>
  );
}

export default function App() {
  return <Greeting name="Taylor" />;
}

どけら�?γ‚³γƒΌγƒ‡γ‚£γƒ³γ‚°γ‚Ήγ‚Ώγ‚€γƒ«γ‚‚ε•ι‘Œγ‚γ‚ŠγΎγ›γ‚“οΏ½?γ§γ€γƒ—γƒ­γ‚Έγ‚§γ‚―γƒˆγ«εˆγ‚γ›γ¦ε₯½γγͺ方を使用してください。createElement と比較して JSX γ‚’δ½Ώη”¨γ™γ‚‹ε ΄εˆοΏ½?δΈ»γͺεˆ©η‚Ήγ―γ€γ©οΏ½?ι–‰γ˜γ‚Ώγ‚°γŒγ©οΏ½?ι–‹γγ‚Ώγ‚°γ«ε―ΎεΏœγ—γ¦γ„γ‚‹γ‹γŒη°‘ε˜γ«γ‚γ‹γ‚‹γ“γ¨γ§γ™γ€‚

さらに深くηŸ₯γ‚‹

React 要素とは要するに何γͺοΏ½?γ‹οΌŸ

要素 (element) とは、ユーアむンターフェース�?軽量γͺθͺ¬ζ˜Žζ›ΈγοΏ½?γ“γ¨γ§γ™γ€‚δΎ‹γˆγ°γ€<Greeting name="Taylor" /> と createElement(Greeting, { name: 'Taylor' }) γ―γ„γšγ‚Œγ‚‚γ€ζ¬‘οΏ½?γ‚ˆγ†γͺγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’η”Ÿζˆγ—γΎγ™γ€‚

// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}

こ�?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’δ½œζˆγ—γŸγ γ‘γ§γ―γ€Greeting γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒγƒ¬γƒ³γƒ€γƒΌγ•γ‚ŒγŸγ‚Šγ€DOM θ¦η΄ γŒδ½œζˆγ•γ‚ŒγŸγ‚Šγ™γ‚‹γ‚γ‘γ§γ―γͺいことに注意してください。

React θ¦η΄ γ¨γ―γ€γ‚€γ—γ‚ζŒ‡η€Ίζ›ΈοΏ½?γ‚ˆγ†γͺγ‚‚οΏ½?です。React に後で Greeting γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’γƒ¬γƒ³γƒ€γƒΌγ™γ‚‹γ‚ˆγ†ζŒ‡η€Ίγ™γ‚‹γ‚‚οΏ½?です。こ�?γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ‚’ App γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‹γ‚‰θΏ”γ™γ“γ¨γ§γ€React γ«ζ¬‘γ«δ½•γ‚’γ™γΉγγ‹γ‚’δΌγˆγ‚‹οΏ½?です。

要素�?作成は非常に�?οΏ½δΎ‘γ§γ‚γ‚‹γŸγ‚γ€ζœ€ι©εŒ–γ—γŸγ‚ŠιΏγ‘γŸγ‚Šγ™γ‚‹εΏ…θ¦γ―γ‚γ‚ŠγΎγ›γ‚“γ€‚