React μμ μμ± λ° λ°°μΉ, μ΄λ²€νΈ λ±λ‘
JSX
React JSλ UIλ₯Ό interactive νκ² λ§λ€μ΄μ€λ€.
μ°μ , React JSκ° μ΄λ€ λ¬Έμ λ₯Ό ν΄κ²°ν΄μ£Όλμ§, μ μ μ©νμ§λ₯Ό μκ³ μ¬μ©ν νμκ° μλ€.
μ΄λ₯Ό μμ보기 μν΄ λ°λλΌ JS μ½λμ React JSλ₯Ό μ¬μ©ν΄ μμ±ν μ½λλ₯Ό λΉκ΅ν΄λ³Ό κ²μ΄λ€.
React JSλ₯Ό μ€μΉνκΈ° μν΄μλ 2κ°μ JavaScript μ½λλ₯Ό import ν΄μΌ νλ€.
νλλ reactμ΄κ³ , λ€λ₯Έ νλλ react-domμ΄λ€.
react
λ μ΄ν리μΌμ΄μ
μ interactive νκ² λ§λ€μ΄μ£Όλ λΌμ΄λΈλ¬λ¦¬μ΄λ€.
react-dom
μ Reactλ‘ μμ±ν React elementλ₯Ό HTML bodyμ λ μ μλλ‘ νλ€.
( μ¬κΈ°μ node.js μ¬μ© x )
<!DOCTYPE html>
<html>
<body></body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
</html>
μ½μμ ReactλΌκ³ μμ±νλ©΄ React Objectκ° μΆλ ₯λλ€.
μ΄μ μ½λμ Reactκ° μ‘΄μ¬νκΈ° λλ¬Έμ μ΄λ₯Ό λΆλ¬μ React.~~~ λΌκ³ μΈ μ μλ€.
β» React JSλ‘ κ΅¬νν΄λ³Ό HTML & λ°λλΌ JS μ½λ
<!DOCTYPE html>
<html>
<body>
<h3 id="total-click">Total Click: 0</h3>
<button id="btn">Click</button>
</body>
<script>
const button = document.querySelector("#btn");
const h3 = document.querySelector("#total-click");
let counter = 0;
const handleBtnClick = () => {
counter++;
h3.innerText = `Total Click: ${counter}`;
};
button.addEventListener("click", handleBtnClick);
</script>
</html>
React JSλ
HTML μ½λλ₯Ό
html νμΌμ μμ±νλ λμJavaScript μ½λλ₯Ό μ¬μ©ν΄ μμ±νλ€.
react-domμ΄ λͺ¨λ React elementλ₯Ό HTML bodyμ λ μ μλλ‘ νλ€.
λ¨Όμ , React elementλ₯Ό μμ±νκΈ° μν΄ μ¬μ©νλ 'μ΄λ €μ΄ λ°©λ²'μ μ΄ν΄λ³Ό κ²μ΄λ€.
μ΄λ κ°λ°μλ€ μ¬μ΄μμ μ€μ λ‘ μ¬μ©λλ λ°©λ²μ μλμ§λ§, React JSμ λ³Έμ§μ μ΄ν΄νλ λ° μ€μνλ€.
λ°λΌμ, μ΄ν΄κ° λͺ©μ μΌ λΏ μ λ μΈμΈ νμλ μλ€.
React element μμ±ν ν μ΄λ₯Ό HTML body μμ λ°°μΉνκΈ°
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
const root = document.getElementById("root");
const h3 = React.createElement("h3", { id: "cool", style: { color: "red" } }, "Hello!");
const btn = React.createElement("button", null, "Click!");
const container = React.createElement("div", null, [h3, btn]);
ReactDOM.render(container, root);
</script>
</html>
React.createElement()
λ React elementλ₯Ό μμ±νλ€.
첫 λ²μ§Έ μΈμλ‘λ μμ±ν νκ·Έ μ΄λ¦μ λ¬Έμμ΄λ‘ λ°λλ€.
λ λ²μ§Έ μΈμλ‘λ ν΄λΉ νκ·Έμ μ μ©νκ³ μ νλ μμ±μ objectλ‘ λ°λλ€.
μΈ λ²μ§Έ μΈμλ‘λ ν΄λΉ νκ·Έμ 컨ν
μΈ λ₯Ό λ°λλ€.
ReactDOM.render()
λ React elementλ₯Ό HTML μμλ‘ λ§λ€μ΄ λ°°μΉν¨μΌλ‘μ¨ μ¬μ©μκ° λ³Ό μ μλλ‘ νλ€.
μ΄λ React elementλ₯Ό μ΄λμ λ°°μΉν κ²μΈμ§λ₯Ό μ§μ ν΄μΌ νλ€.
κ°μ₯ λ§μ΄ μ¬μ©λλ λ°©λ²μ body μμ idκ° rootμΈ div μμ
βbody μμ μμ±ν μ μΌν HTML μ½λμ΄λ€βλ₯Ό λ§λ ν JS νμΌμμ μ΄λ₯Ό κ°μ Έμ μ¬κΈ°μ μ§μ νλ κ²μ΄λ€.
μ¬λ¬ κ°μ React elementλ₯Ό renderνκ³ μΆλ€λ©΄
, μ¬λ¬ κ°μ React elementλ₯Ό ν¬ν¨ν containerλ₯Ό λ§λ ν μ΄λ₯Ό render ν΄μΌ νλ€.
μ΄λ containerλ₯Ό λ§λλ React.createElement()μ μΈ λ²μ§Έ μΈμμλ containerκ° ν¬ν¨ν HTML μμλ€μ μμ΄ν
μΌλ‘ κ°μ§λ λ°°μ΄μ μ λ¬ν΄μΌ νλ€.
μ΄μ κ°λ°μ λꡬμ Elements νμμ body μμ span νκ·Έκ° μ‘΄μ¬νλ κ²μ νμΈν μ μλ€.
λ°λλΌ JS VS React JS
λ°λλΌ JSλ₯Ό μ¬μ©νλ©΄(HTMLβJS) HTML μμλ₯Ό λ§λ ν μ΄λ₯Ό js νμΌλ‘ κ°μ Έμ€λ λ°λ©΄,
React JSλ₯Ό μ¬μ©νλ©΄(JSβHTML) HTMLμ λ°°μΉν μμλ₯Ό JavaScriptλ‘ λ§λ λ€λ μ°¨μ΄μ μ΄ μλ€.μ΄λ 곧
React JSκ° HTMLμ μ λ°μ΄νΈ ν¨μΌλ‘μ¨ μ¬μ©μμκ² λ³΄μ¬μ§ λ΄μ©μ 컨νΈλ‘€
ν μ μμμ μλ―Ένλ€.
μμ React elementλ₯Ό μμ±ν λ React.createElement()μ λ λ²μ§Έ μΈμμ ν΄λΉ μμμ μ μ©ν μμ±μ μ λ¬ν μ μλ€κ³ νλλ°, μ΄λ₯Ό μ΄μ©ν΄ eventλ₯Ό λ±λ‘ν μλ μλ€.
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script>
const root = document.getElementById("root");
const h3 = React.createElement(
"h3",
{
onMouseEnter: () => console.log("mouse enter"),
style: { color: "red" },
},
"Hello!"
);
const btn = React.createElement(
"button",
{ onClick: () => console.log("click") },
"ν΄λ¦"
);
const container = React.createElement("div", null, [h3, btn]);
ReactDOM.render(container, root);
</script>
</html>
μμ, React elementλ₯Ό μμ±νκΈ° μν΄ μ¬μ©νλ μ΄λ €μ΄ λ°©λ²μ μ΄ν΄λ΄€λ€.
JSXλ₯Ό μ¬μ©νλ©΄ 'λ³΄λ€ μ½κ³ νΈλ¦¬νκ²' React elementλ₯Ό μμ±ν μ μλ€.
JSXλ μλ°μ€ν¬λ¦½νΈλ₯Ό νμ₯ν λ¬Έλ²μ΄μ§λ§ HTMLμμ μ¬μ©ν λ¬Έλ²κ³Ό λΉμ·
νμ¬ React.createElement()λ₯Ό μ¬μ©νλ κ²λ³΄λ€ μ’ λ μ½κ² React μμλ₯Ό λ§λ€ μ μλλ‘ νλ€.
// React.createElement() μ¬μ©
const h3 = React.createElement(
"h3",
{
onMouseEnter: () => console.log("mouse enter"),
style: { color: "red" },
},
"Hello!"
);
const btn = React.createElement(
"button",
{ onClick: () => console.log("click") },
"ν΄λ¦"
);
// JSXλ‘ μμ±ν μ½λ
const Title = (
<h3
onMouseEnter={() => console.log("mouse enter")} // λ±νΈ(=) λ€μ {}λ₯Ό μ΄λ€, μμ± λμ μΌνλ μ°μ§ μλλ€
style={{ color: "red" }}
>
Hello!
</h3>
);
const Button = <button onClick={() => console.log("click")}>ν΄λ¦</button>;
ννΈ, λΈλΌμ°μ λ JSXλ‘ μμ±ν μ½λλ₯Ό κΈ°λ³Έμ μΌλ‘ μ΄ν΄ν μ μλ€.
λΈλΌμ°μ κ° JSXλ‘ μμ±ν μ½λλ₯Ό μ΄ν΄ν μ μλλ‘ React μ½λλ‘ λ°κΎΈκΈ° μν΄
babelμ μ¬μ©ν΄μΌ νλ€.
(μ¬κΈ°μ node.js μ¬μ© x)
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
<!-- JSXλ‘ μμ±ν μ½λ -->
</script>
μμ, μ¬λ¬ κ°μ React elementλ₯Ό renderνκ³ μΆμ λλ, μ¬λ¬ κ°μ React elementλ₯Ό ν¬ν¨ν containerλ₯Ό λ§λ ν μ΄λ₯Ό render ν΄μΌ νλ€κ³ νλ€.
μ΄λ containerλ₯Ό λ§λ€κΈ° μν΄ React.createElement() λμ JSXλ₯Ό μ¬μ©ν΄ μ½λλ₯Ό μμ±ν μ μλ€.
- μ°μ , HTML μμλ₯Ό λ΄κ³ μλ λ³μλ€μ ν¨μλ‘ λ§λ€μ΄μΌ νλ€.
- μ¬λ¬ κ°μ μ»΄ν¬λνΈλ₯Ό ν¬ν¨ν μ»΄ν¬λνΈλ ν¨μλ‘ λ§λ λ€.
- ν΄λΉ μμ μ»΄ν¬λνΈμ μ¬λ¬ κ°μ νμ μ»΄ν¬λνΈλ€μ μΆκ°νλ€. (JSX λ¬Έλ²μ λ°λ₯Έλ€)
- μμ μ»΄ν¬λνΈλ₯Ό render νλ€.
π‘ μ£Όμ!
μ΄λ μ§μ λ§λ μ»΄ν¬λνΈ μ΄λ¦μ 첫 λ²μ§Έ κΈμλ, μΌλ° HTML μμμ ꡬλΆνκΈ° μν΄, λ°λμ 'λλ¬Έμ'μ¬μΌ νλ€.
const root = document.getElementById("root");
// h3 νκ·Έλ₯Ό κ°μΈκ³ μλ ()λ VS Codeμμ μλμΌλ‘ μκΈ΄ κ²μ΄λ€
// κ·Έλ₯ h3 νκ·Έλ₯Ό return νλ νμ΄ν ν¨μμΌ λΏμ΄λ€
const Title = () => (
<h3
onMouseEnter={() => console.log("mouse enter")}
style={{ color: "red" }}
>
Hello!
</h3>
);
const Button = () => (
<button onClick={() => console.log("click")}>ν΄λ¦</button>
);
const Container = () => (
<div>
<Title />
<Button />
</div>
);
ReactDOM.render(<Container />, root);