createElement
createElement๋ฅผ ์ฌ์ฉํ๋ฉด React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. JSX๋ฅผ ์์ฑํ๋ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const element = createElement(type, props, ...children)๋ ํผ๋ฐ์ค
createElement(type, props, ...children)
type, prop, children๋ฅผ ์ธ์๋ก ์ ๊ณตํ๊ณ createElement์ ํธ์ถํ์ฌ 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๊ฐ์ฒด์ref์key๋ ํน์ํ๊ธฐ ๋๋ฌธ์ ์์ฑํ์๋ฆฌ๋จผํธ์์element.props.ref์element.props.key๋ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์.element.ref๋๋element.key๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. -
์ ํ์ฌํญ
...children: 0๊ฐ ์ด์์ ์์ ๋ ธ๋. React ์๋ฆฌ๋จผํธ, ๋ฌธ์์ด, ์ซ์, ํฌํ, ๋น ๋ ธ๋(null,undefined,true,false) ๊ทธ๋ฆฌ๊ณ React ๋ ธ๋ ๋ฐฐ์ด์ ํฌํจํ ๋ชจ๋ React ๋ ธ๋๊ฐ ๋ ์ ์์ต๋๋ค.
๋ฐํ๊ฐ
createElement๋ ์๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ React ์๋ฆฌ๋จผํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
type: ์ ๋ฌ๋ฐ์type.props:ref์key๋ฅผ ์ ์ธํ ์ ๋ฌ๋ฐ์props.type์ด ๋ ๊ฑฐ์type.defaultProps๋ฅผ ๊ฐ์ง๋ ์ปดํฌ๋ํธ๋ผ๋ฉด, ๋๋ฝ๋๊ฑฐ๋ ์ ์๋์ง ์์props๋type.defaultProps๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.ref: ์ ๋ฌ๋ฐ์ref. ๋๋ฝ๋ ๊ฒฝ์ฐnull.key: ์ ๋ฌ๋ฐ์key๋ฅผ ๊ฐ์ ๋ณํํ ๋ฌธ์์ด. ๋๋ฝ๋ ๊ฒฝ์ฐnull.
์ผ๋ฐ์ ์ผ๋ก ์๋ฆฌ๋จผํธ๋ ์ปดํฌ๋ํธ์์ ๋ฐํ๋๊ฑฐ๋ ๋ค๋ฅธ ์๋ฆฌ๋จผํธ์ ์์์ผ๋ก ๋ง๋ญ๋๋ค. ์๋ฆฌ๋จผํธ์ ํ๋กํผํฐ์๋ ์ ๊ทผํ ์ ์์ง๋ง, ์๋ฆฌ๋จผํธ ์์ฑ ํ์๋ ๋ชจ๋ ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ํ๊ณ ๋ ๋๋ง๋ง ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฃผ์ ์ฌํญ
-
๋ฐ๋์ React ์๋ฆฌ๋จผํธ์ ๊ทธ ํ๋กํผํฐ๋ ๋ถ๋ณํ๊ฒ ์ทจ๊ธํด์ผํ๋ฉฐ ์๋ฆฌ๋จผํธ ์์ฑ ํ์๋ ๊ทธ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ด์ ์ ๋ฉ๋๋ค. ๊ฐ๋ฐํ๊ฒฝ์์ React๋ ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฐํ๋ ์๋ฆฌ๋จผํธ์ ๊ทธ ํ๋กํผํฐ๋ฅผ ์๊ฒ freezeํฉ๋๋ค.
-
JSX๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ๊ทธ๋ฅผ ๋๋ฌธ์๋ก ์์ํด์ผ๋ง ์ฌ์ฉ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ฆ,
<Something />์createElement(Something)๊ณผ ๋์ผํ์ง๋ง<something />(์๋ฌธ์) ์createElement('something')์ ๋์ผํฉ๋๋ค. (๋ฌธ์์ด์์ ์ฃผ์ํ์ธ์. ๋ด์ฅ๋ HTML ํ๊ทธ๋ก ์ทจ๊ธ๋ฉ๋๋ค.) -
createElement('h1', {}, child1, child2, child3)์ ๊ฐ์ด children์ด ๋ชจ๋ ์ ์ ์ธ ๊ฒฝ์ฐ์๋งcreateElement์ ์ฌ๋ฌ ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. children์ด ๋์ ์ด๋ผ๋ฉด ์ ์ฒด ๋ฐฐ์ด์ ์ธ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด React๋ ๋๋ฝ๋ํค์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค. ์ ์ ๋ชฉ๋ก์ธ ๊ฒฝ์ฐ ์ฌ์ ๋ ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
JSX ์์ด ์๋ฆฌ๋จผํธ ์์ฑํ๊ธฐ
JSX๊ฐ ๋ง์์ ๋ค์ง ์๊ฑฐ๋ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, createElement๋ฅผ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
JSX ์์ด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ค๋ฉด type, props, children์ ํจ๊ป createElement๋ฅผ ํธ์ถํฉ๋๋ค
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}children์ ์ ํ ์ฌํญ์ด๋ฉฐ ํ์ํ ๋งํผ ์ ๋ฌํ ์ ์์ต๋๋ค. (์ ์์์๋ 3๊ฐ์ children์ด ์์ต๋๋ค.) ์ ์ฝ๋๋ ์ธ์ฌ๋ง์ด ํฌํจ๋ <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๋ฅผ ์ฌ์ฉํ ๋์ ์ฅ์ ์ ์ด๋ค ๋ซ๋ ํ๊ทธ๊ฐ ์ด๋ค ์ฌ๋ ํ๊ทธ์ ๋์๋๋์ง ์ฝ๊ฒ ํ์ธํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
Deep Dive
์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์ผ๋ถ์ ๋ํ ํํ์
๋๋ค. ์๋ฅผ ๋ค์ด <Greeting name="Taylor" />์ createElement(Greeting, { name: 'Taylor' })๋ ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
// ์ฝ๊ฐ ๋จ์ํ๋จ
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด๋ Greeting ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๊ฑฐ๋ DOM ์๋ฆฌ๋จผํธ๊ฐ ์์ฑ๋์ง๋ ์๋๋ค๋ ์ ์ ์ฃผ์ํ์ธ์.
React ์๋ฆฌ๋จผํธ๋ ๋์ค์ React๊ฐ Greeting ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋๋ก ์ง์ํ๋ ์ค๋ช
์์ ๋น์ทํฉ๋๋ค. App ์ปดํฌ๋ํธ์์ ์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํจ์ผ๋ก์จ React์๊ฒ ๋ค์ ํ ์ผ์ ์ง์ํ ์ ์์ต๋๋ค.
์๋ฆฌ๋จผํธ ์์ฑ ๋น์ฉ์ ๋งค์ฐ ์ ๋ ดํ๋ฏ๋ก ์๋ฆฌ๋จผํธ ์์ฑ์ ์ต์ ํํ๊ฑฐ๋ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํ ํ์๊ฐ ์์ต๋๋ค.