๋ฆฌ์กํธ๋ฅผ ๋ฐฐ์ฐ๋ฉด ์์ฃผ ๋ฃ๋ ๋ง์ด ์๋ค. ๋ฆฌ์กํธ๋ ๋ณํํ ๋ถ๋ถ๋ง ๊ฐ์งํด์ ๊ทธ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ ํด์ค๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ผ๋ ๊ฑด๋ฐ ๋ง๋ก๋ง ๋ค์ด์๋ ์ ์๋ฟ์ง ์๋๋ค. ์ด ๋ด์ฉ์ ํ๋ฒ ํ์ธํด๋ณด์.
const elem = <button>{number}</button>;
๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ ๋ฆฌ์กํธ ์ฑ์ ๊ตฌ์ฑํ๋ ๊ฐ์ฅ ์์ ๋จ์์ด๋ค.
๋ค์๊ณผ ๊ฐ์ jsx ๋ฌธ๋ฒ์ ํตํด ๋ง๋ค์ด์ง ์์๊ฐ ์๋ฆฌ๋จผํธ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
์ผํ ๋ณด๋ฉด HTML ํ๊ทธ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ด๊ฑด DOM ์์๊ฐ ์๋ ๋ฆฌ์กํธ ์๋ฆฌ๋จผํธ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ๋ ๋๋ง ํจ์๋ฅผ ๊ฑฐ์ณ์ผํ๋ค.
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(elem);
๊ณผ๊ฑฐ์๋ ReactDOM.render๋ก ํธ์ถํ๋ค.
ํ์ง๋ง ๋ฆฌ์กํธ 18 ๋ฒ์ ๋ถํฐ๋ createRoot๋ฅผ ํตํด root ์๋ฆฌ๋จผํธ๋ฅผ ์ง์ ํ๊ณ ๊ทธ root ์๋ฆฌ๋จผํธ๋ฅผ ํตํด render ํจ์๋ฅผ ํธ์ถํด์ผํ๋ค.
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๋ฉด ๋ฐ๋๋ผ js์ ๋ฑํ ๋ค๋ฅธ ๊ฒ ์์ด ๋ณด์ธ๋ค. ๋ณธ๊ฒฉ์ ์ธ ์ฐจ์ด์ ์ ์์๋ณด์.
let number = 0;
const root = ReactDOM.createRoot(document.getElementById("root"));
function setNumber() {
console.log("hello");
number++;
const elem = <button children={["The current count is", number]}></button>;
root.render(elem);
}
setInterval(setNumber, 500);
const root = document.getElementById("root");
let number = 0;
function setNumber() {
console.log("hello");
number++;
const elem = `<button>The current count is {number}</button>`;
root.innerHTML = elem;
}
setInterval(setNumber, 500);
๋์ ์ฐจ์ด๋ฅผ ํ์คํ๊ฒ ์ ์ ์๋ค. ๋ฐ๋๋ผ js๋ ํด๋น ์๋ฆฌ๋จผํธ ์์ฒด๋ฅผ ๋ฆฌ๋ ๋๋งํ๊ณ ๋ถ๋ชจ๊น์ง ๋ค์ ๋ ๋๋งํ๋ค.
ํ์ง๋ง ๋ฆฌ์กํธ๋ button ํ๊ทธ ๋ด๋ถ์ ์กด์ฌํ๋ number ๊ฐ๋ง ๋ค์ ๊ทธ๋ ค์ฃผ๊ณ ์๋ค.
์ด๊ฒ์ button์ ํฌ์ปค์ค๋ฅผ ์ ์งํ๊ณ ๋์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๋ฉด ๋ ์ ๋ช ํ๊ฒ ๋ํ๋๋ค.
์ง๊ธ์ ๋จ์ํ ํ๋์ DOM ์์๋ก๋ง ๋น๊ตํ๊ณ ์์ง๋ง ์ผ๋ฐ์ ์ธ ์น ์ฑ์ ํ๋์ DOM ์์๋ก๋ง ์ด๋ฃจ์ด์ ธ์์ง ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ฆฌ์กํธ์ ์ฅ์ ์ ๊ท๋ชจ๊ฐ ์๋ ์น ์ฑ์์ ๋์ฑ ๋๋๋ฌ์ง๋ค.
React ์๋ฆฌ๋จผํธ๋ ๋ถ๋ณ๊ฐ์ฒด์ ๋๋ค.
๋ค์์ ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์์ ์๋ ๋ฌธ์ฅ์ด๋ค. ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๊ณ ๊ทธ๊ฒ์ render ํจ์์ ์ ๋ฌํ์ฌ UI๋ฅผ ๋ณด์ฌ์ค๋ค.
๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ํ๋ฒ ์์ฑ๋ ์๋ฆฌ๋จผํธ๋ ์์์ด๋ ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค๊ณ ํ๋ค. ํ์ง๋ง ์์ ์์์์๋ children์ด ์ ๋ฐ์ดํธ ๋๊ณ ์๋ค.
์ด๊ฒ์ ์๋ฆฌ๋จผํธ์ ์์์ ๋ณ๊ฒฝํ ๊ฒ ์๋๋ค.
const elem = <button children={["The current count is", number]}></button>;
root.render(elem);
์์ ํจ์๋ ์๋ก์ด elem์ ๋ค์ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ render์ ๋ ์ ๋ฌํ๋ค. ์ด๋ ๋ฆฌ์กํธ๋ ์ฌ์กฐ์ (Reconciliation) ์์ ์ ํ๋ค.
ํน์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ด ์คํ๋๋ฉฐ ๋ฆฌ์กํธ๊ฐ ์ฃผ์ด์ง elem๊ณผ ์๋ ์๋ ์์๋ฅผ ๋ณด๋ฉฐ ์ด๋ค ๋ถ๋ถ์ด ์ ๋ฐ์ดํธ ๋์ด์ผ ํ๋์ง ํ๋จํ๋ค.
const state = { content: "" };
const root = ReactDOM.createRoot(document.getElementById("root"));
function setContent(e) {
state.content = e.target.value;
}
const elem = (
<div>
<h1>{state.content}</h1>
<input type='text' onChange={setContent} />
</div>
);
root.render(elem);
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋ render๋ฅผ ํตํด ์ ๋ฌํ ๊ฐ์ฒด๋ ๊ทธ๋๋ก๊ธฐ ๋๋ฌธ์ด๋ค.
const state = { content: "" };
const root = ReactDOM.createRoot(document.getElementById("root"));
function setContent(e) {
state.content = e.target.value;
const elem = (
<div>
<h1>{state.content}</h1>
<input type='text' onChange={setContent} />
</div>
);
root.render(elem);
}
const elem = (
<div>
<h1>{state.content}</h1>
<input type='text' onChange={setContent} />
</div>
);
root.render(elem);
๋ค์๊ณผ ๊ฐ์ด ๋ ๋ ํจ์๋ฅผ ์ง์์ ์ผ๋ก ํธ์ถํ๋ฉด์ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํฌ ์ ์๋ค.
์ฐ๋ฆฌ๋ ๋จ์ง ์๋กญ๊ฒ ๋ง๋ค์ด์ง elem์ ์ ๋ฌํ ๋ฟ ๋น๊ต์ ๋ณ๊ฒฝ์ ๋ฆฌ์กํธ๊ฐ ํ๋จํ๋ค.