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์๊ฒ ๋ค์ ํ ์ผ์ ์ง์ํ ์ ์์ต๋๋ค.
์๋ฆฌ๋จผํธ ์์ฑ ๋น์ฉ์ ๋งค์ฐ ์ ๋ ดํ๋ฏ๋ก ์๋ฆฌ๋จผํธ ์์ฑ์ ์ต์ ํํ๊ฑฐ๋ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํ ํ์๊ฐ ์์ต๋๋ค.