Post

๐ŸŒŒ React ์ž…๋ฌธ โ…ฃ - Element

๐ŸŒŒ React ์ž…๋ฌธ โ…ฃ - Element

๐Ÿ“˜ ใ€Ž์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธใ€๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

Element๋ž€?

  • Chrome ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” Elements๋Š” DOM Element๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • DOM Element๋ž€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹ค์ œ๋กœ ๋ Œ๋”๋ง ๋œ HTML ์š”์†Œ์ด๋‹ค.ย 
  • React Element๋Š” ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ๋‚ด์šฉ์„ ๊ธฐ์ˆ ํ•œ Javascript ๊ฐ์ฒด๋ฅผ ์ผ์ปซ๋Š”๋‹ค.
  • ์ฆ‰ DOM์— ์ง์ ‘ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* JSON ํ˜•ํƒœ
{
ย ย type: 'button',
ย ย props: {
ย ย ย ย className: 'bg-green',
ย ย ย ย children: {
ย ย ย ย ย ย type: 'b',
ย ย ย ย ย ย props: {
ย ย ย ย ย ย ย ย children: 'ํ…Œ์ŠคํŠธ์šฉ ํ…์ŠคํŠธ ์ž…๋‹ˆ๋‹ค!'
ย ย ย ย ย ย } 
ย ย ย ย }
ย ย }
}
*/

// ๋ฆฌ์•กํŠธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” JSX ๋ฌธ๋ฒ•
<button className="bg-green">
ย ย <b>
ย ย ย ย ํ…Œ์ŠคํŠธ์šฉ ํ…์ŠคํŠธ ์ž…๋‹ˆ๋‹ค!
ย ย </b>
</button>
  • JSON ํ˜•ํƒœ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋ถ€๋ถ„์ด React Element์ด๋‹ค.
  • ๋งŒ๋“ค์–ด์ง„ React Element๋Š” DOM์— ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค.
  • JSX ๋ฌธ๋ฒ•๋„ React Element๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค.
  • Element์˜ type์—๋Š” HTML ํƒœ๊ทธ๋ช…์ด ๋ฌธ์ž์—ด๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ React์˜ Component๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ Component๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ Component๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ž์‹ Component๋ฅผ ์ญ‰ ๋ถ„ํ•ดํ•˜๋‹ค ๋ณด๋ฉด ๊ฒฐ๊ตญ HTML ํƒœ๊ทธ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.
  • Element์˜ props๋Š” ๋ถ€๋ชจ Component์—์„œ ์ž์‹ Component๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Element๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ Element๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Element ๋ Œ๋”๋ง

  • ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐฑ์‹  ๋˜๋Š” ์‹œ์ ์— Virtual DOM์€ ์ „์ฒด UI๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.
  • ์ด๋•Œ ๊ฐ€์ ธ์˜จ ํŠธ๋ฆฌ์˜ ๋ณต์‚ฌ๋ณธ๊ณผ ๊ธฐ์กด ํŠธ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ UI์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ •ํ™•ํžˆ๋Š” ๋ฐ”๋€ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๊นŒ์ง€ UI์— ๋ฐ˜์˜๋œ๋‹ค.
  • ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ Element๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ต์ฒดํ•ด ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋˜๋Š” ํšŸ์ˆ˜๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์š”์†Œ์ด๋‹ค.

Root DOM node

1
<div id="root"></div>
  • ๋ชจ๋“  React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋˜๋Š” ํ•„์ˆ˜์ ์ธ ์ฝ”๋“œ์ด๋‹ค.
  • ์ด div ํƒœ๊ทธ ์•ˆ์— React Element๋“ค์ด ์‹ค์ œ๋กœ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ•˜๋‚˜์˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Root DOM node๋ฅผ ๊ฐ–๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

React Element ๋ Œ๋”๋ง

1
2
3
const element = <h1>ํ…์ŠคํŠธ</h1>;
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(element);
  • render() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Root DOM node์— React Element๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

์‹ค์Šต

1
2
3
4
5
6
7
8
9
10
11
12
import React from "react";

function Clock() {
	return (
		<div>
			<h1>๐Ÿ•’ ํ˜„์žฌ ์‹œ๊ฐ„</h1>
			<h2>โœ… {new Date().toLocaleTimeString()}</h2>
		</div>
	);
}

export default Clock;
  • ๋‹จ์ˆœํžˆ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋Š” Component์ด๋‹ค.
  • ์ด Component ๋งŒ์œผ๋กœ๋Š” ํ™”๋ฉด์ด ๋‹จ ํ•œ ๋ฒˆ๋ฐ–์— ๊ฐฑ์‹  ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.ย 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import Team from './Team';

const root = ReactDOM.createRoot(document.getElementById('root'));
setInterval(() => {
	root.render(
		<React.StrictMode>
			<Clock/>
		</React.StrictMode>
	);
}, 1000);

reportWebVitals();
  • setInterval() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค Clock Component๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.
  • new Date().toLocaleTimeString() ๊ฐ’์ด 1์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹  ๋˜๋ฉด์„œย 
  • Clock Component์˜ ์†์„ฑ ๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ React๊ฐ€ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  1์ดˆ๋งˆ๋‹ค ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.ย 

ํšŒ๊ณ 

  • React๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์กด์žฌํ•˜๋Š” Component๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.