๐ ๊ฐ๋ฐ ๊ณต๋ถ 6๊ฐ์ ์ฐจ์ธ to-be ๊ฐ๋ฐ์์ ์์ต blog๐๏พ MMM DD ~ DD, YYYY
ํ์ฌ ์ํ
HTML๋ถํฐ React๊น์ง ๊ฐ์๋ฅผ ๋ฐ๋ณตํด์ ๋ค์๋๋ฐ, ๊ทธ ์ค ๋์๊ฒ ๋ง์น phase 1์ ๋ํ์๊ฐ์ React๋ฅผ ์์ฃผ ์ฝ๊ฒ ์ค๋ช ํด ์ฃผ๋ ๊ฐ์๋ฅผ ์ฐพ์ ๊ฒ ๊ฐ์ remindํ ๊ฒธ ์๊ฐํด๋ณด์๋ค.
๊ฐ์ ๋ด์ฉ ์ค "'ํจ์๋ component๋ ๋ฌด์จ ์๊ด์ด์ง?'๋ผ๊ณ ์๊ฐํ์ค ์๋ ์๋๋ฐ์."๋ผ๋ ๋ถ๋ถ์ ๊ฐ๋(?)...!
์ฒ์ React๋ฅผ ๋จธ๋ฆฌ์ ๋ฃ์ ๋ (๋ฐฐ์ด ๊ฑฐ ์๋๊ณ ๋ฃ์ด์ผ ํ์ผ๋...ลโฝล) ์์ ๋ฐฐ์ด JS๋ DOM ์ด๋ฐ ๊ฒ๋ค์ด ์ ๋ฆฌ๋์ด ์์ง ์๋ค ๋ณด๋ ์๊ณ ๋ณด๋ฉด ๋ณด์ด๋ ๊ทธ ์ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๊นจ๋ซ์ง ๋ชปํ๋ค.
'ํจ์๋ก ์ด๋ป๊ฒ ๋์์ ๋ง๋ ๋ค๋ ๊ฑด์ง' ํ๋์ ์ดํดํ์ง ๋ชปํด ํ๋ค์๋ ๋ ๋ค์ด ๋ ์ค๋ฅธ๋ค.
P.S. ์ง์ ๋ฆผ ๋์ ๊ฐ์ ๋ง์ง๋ง ๋ถ๋ถ์์ CRA๋ฅผ ์ฌ์ฉํ์ ๋ค.
link to ๐ผ
โป ๋ชฉํ : body์ ๋์ ์ธ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
// ๐ต ๊ณ ์์ด ์ฌ์ง์ ์๋ heart ๋ชจ์ button์ ๋๋ฅด๋ฉด ์ด button์ด ๋ค๋ฅธ ๋ชจ์์ผ๋ก ๋ฐ๋๊ณ <li /> ํ์์ ํด๋นํ๋ ๊ณ ์์ด ์ฌ์ง์ ์ถ๊ฐํ๊ธฐ
// (1)
<body>
<script>
// STEP 1. ์ข์์ button ์ฐพ๊ธฐ
const likeButton = document.querySelector(".main-card button");
// STEP 2. ์ข์์ button์ click event ๋ถ์ฌํ๊ธฐ
likeButton.addEventListener("click", function () {
// STEP 3. ์ข์์ button์ clickํ์ ๋ button ๋ณ๊ฒฝํ๊ธฐ
likeButton.innerHTML = "๐";
// STEP 4. ์ข์์ ํ ๊ณ ์์ด๋ฅผ ์ถ๊ฐํ ๊ณณ ์ฐพ๊ธฐ
const favorites = document.querySelector(".favorites");
// STEP 5. ์๋ก์ด ๊ณ ์์ด ์ฌ์ง ๋ง๋ค๊ธฐ = <img src="">
const newFavoriteImage = document.createElement("img");
newFavoriteImage.src = "https://cataas.com/cat/60b73094e04e18001194a309/says/react";
// STEP 6. ๊ณ ์์ด ์ฌ์ง์ ๊ฐ์ธ๋ li tag ๋ฃ๊ธฐ = <li> <img> </li>
const li = document.createElement('li');
// STEP 7. li tag์ ๊ณ ์์ด ์ฌ์ง ๋ฃ๊ธฐ
li.appendChild(newFavoriteImage);
// STEP 8. ์ข์์ ํ ๊ณ ์์ด๋ฅผ ์ถ๊ฐํ ๊ณณ์ ๋ฐฉ๊ธ ๋ง๋ ์์๋ฅผ ๋ฃ๊ธฐ
favorites.appendChild(li);
});
</ script>
</body>
JavaScript์ผ๋ก ๊ธฐ๋ฅ๋ ๊ตฌํํ๊ณ ๋ด์ฉ๋ ๊ทธ๋ ค๋ด์ผ ํ๋๋ฐ ๊ทธ ๋ฌธ๋ฒ์ด ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ด๋ค.
// ๐ต ๊ณ ์์ด ์ฌ์ง์ ์๋ heart ๋ชจ์ button์ ๋๋ฅด๋ฉด ์ด button์ด ๋ค๋ฅธ ๋ชจ์์ผ๋ก ๋ฐ๋๊ณ <li /> ํ์์ ํด๋นํ๋ ๊ณ ์์ด ์ฌ์ง์ ์ถ๊ฐํ๊ธฐ
// (2)
<body>
// STEP 2. ๊ณ ์์ด ์ฌ์ง์ ๋ฃ์ด์ค ๊ณต๊ฐ ๋ง๋ค๊ธฐ
<div id="app"></div>
<script>
// STEP 1. <li / >๋ก ๊ณ ์์ด ์ฌ์ง์ ๊ฐ์ธ๊ธฐ
const catItem = (
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
);
// STEP 3. ๊ณ ์์ด ์ฌ์ง์ ๊ทธ๋ฆด ์์น์ธ app ์ฐพ๊ธฐ
const ์ฌ๊ธฐ = document.querySelector("#app");
// STEP 4. React๋ฅผ ์ฌ์ฉํด์ catItem์ "์ฌ๊ธฐ"์ ๊ทธ๋ฆฌ๊ธฐ (render)
ReactDOM.render(catItem, ์ฌ๊ธฐ);
</script>
</body>
์ด๋ ๊ฒ๋ง ํ๋ฉด <script />
๋ด์์ HTML ๋ฌธ๋ฒ์ ์ด ๊ฑฐ๋ผ์ ์ค๋ฅ๊ฐ ๋๋ฏ๋ก
('Uncaught SyntaxError: Unexpected token'<'' : '๊บฝ์ ๋ชจ์์ ๋ด๊ฐ ๋ชจ๋ฅด๋ token์ธ๋ฐ?'๋ผ๋ ์๋ฏธ์ JavaScript error๊ฐ ๋จ)
์ธ ๊ฐ์ง script ๊ด๋ จ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ณ script์ type์ "text/babel"๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
// ๐
// ๐ต React์ source code ์ถ๊ฐํ๊ธฐ
<body>
<div id="app"></div>
// STEP 1. React library์ source code ์ถ๊ฐ
<script
src="https://unpkg.com/react@17/umd/react.development.js"
crossorigin></script>
// STEP 2. React DOM library์ source code ์ถ๊ฐ
<script
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
crossorigin></script>
// STEP 3. Babel code ์ถ๊ฐ
<script
src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
// STEP 4. <script>์ type ๋ณ๊ฒฝ
<script type="text/babel">
const catItem = (
<li>
<img src="https://cataas.com/cat/60b73094e04e18001194a309/says/react" />
</li>
);
const ์ฌ๊ธฐ = document.querySelector("#app");
ReactDOM.render(catItem, ์ฌ๊ธฐ);
</script>
</body>
JavaScript๋ก๋ง ๊ตฌํํ๋ ๊ฒ๋ณด๋ค React๋ก ํ๋ ๊ฒ์ด <script />
์์๋ HTML ๋ฌธ๋ฒ์ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ code๊ฐ ๋ ์ง๊ด์ ์ด๊ณ ๊น๋ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด <script />
๋ด์์ JS๋ก ์ธ ๋๋ณด๋ค ์ฌ์ด HTML ๋ฌธ๋ฒ์ ์ฐ๊ณ ๋ HTML์ ์๋ <div id="app"></div>
์ img
๊ฐ ๊ทธ๋ ค์ง๊ฒ ํ ์ ์๋ค.
Babel์ ์ผ์ข
์ ํต์ญ์ฌ ('compiler'๋ก ํํํ๊ณ ์์) ์ด๋ค.
๋ด๊ฐ ํธํ๊ฒ ์ ์ JSX ๋ฌธ๋ฒ์ browser๊ฐ ์ดํดํ ์ ์๊ฒ JavaScript๋ก ๋ฐ๊ฟ ์ค๋ค. ('Get browser-compitable JavaScript out') .
๋ด๊ฐ ์ ์ React ๊ตฌ๋ฌธ์ (const catItem
~ ReactDom.render
๋ถ๋ถ) Babel sited์์ ํ์ธํด ๋ณด๋ฉด React๋ก ์์ฑํ code๊ฐ browser์ ์ธ์ด๋ก ๋ณ๊ฒฝ๋์ด ์๋๋ฐ, ์ด๋ ๊ฐ๋ฐ์๋๊ตฌ์์ head tag์์ ์๋ก ์๊ธด <script />
์์๋ ํ์ธํ ์ ์๋ค.
e.g. React.createElement("img", ...)
Babel ๋๋ถ์ browser๊ฐ ๋ด code๋ฅผ ์ดํดํ ์ ์๋ ๊ฒ์ด๋ค.
// ๐ต {name}๊ณผ {introduction} component๋ฅผ ํจ์์ ๋ฃ๊ธฐ
function Profile(name, introduction) {
return (
<div>
<h2>{name}</h2>
{introduction}
</div>
);
}
Profile("Ian", "๊ฐ๋ฐ ์ ํ๊ณ ์ถ๋ค."); // <div /> element์ ์๋ name ์๋ฆฌ์ "Ian", introduction ์๋ฆฌ์ "๊ฐ๋ฐ ์ ํ๊ณ ์ถ๋ค."
Profile("Mai", "๋๋ ์ธ์ ๊ฐ Typescript ํ๊ณ ์ถ๋ค."); // <div /> element์ ์๋ name ์๋ฆฌ์ "Mai", introduction ์๋ฆฌ์ "๋๋ ์ธ์ ๊ฐ Typescript ํ๊ณ ์ถ๋ค."
// โ ์์ฒ๋ผ ํจ์๋ฅผ ํธ์ถํ๋ฏ ์ฐ์ง ์๊ณ tag์ฒ๋ผ ์ธ ์๋ ์์
<Profile name ="Ian" introduction = "๊ฐ๋ฐ ์ ํ๊ณ ์ถ๋ค." />
<Profile name = "Mai" introduction = "๋๋ ์ธ์ ๊ฐ Typescript ํ๊ณ ์ถ๋ค." />
// ๐ต 1์ฉ ์ฆ๊ฐํ๋ ์ํ ๋ง๋ค๊ธฐ
const counterState = React.useState(1); // ์ธ์๋ก ๋ค์ด๊ฐ 1์ ์ด๊ธฐ๊ฐ์
const counter = counterState[0]; // useState์ ์ฒซ ๋ฒ์งธ ์ํ (counterState[0]) ๋ counter ๊ทธ ์์ฒด์ด๊ณ
const setCounter = counterState[1]; // useState์ ๋ ๋ฒ์งธ ์ํ (counterState[1]) ๋ counter๋ฅผ ์กฐ์ํ setCounter
// โ
const [counter, setCounter] = React.useState(1);
console.log("์นด์ดํฐ", counter);
// STEP 1. favorites์ ์ํ๊ฐ ๋ณํ๋ฏ๋ก state๋ฅผ ์ถ๊ฐํ๊ณ ์ด๊ธฐ๊ฐ ์ค์ const [favorite, setFavorites] = React.useState([CAT1, CAT2]);
// STEP 2. mainCard์์ ํํธ๋ฅผ ๋๋ ์ ๋ `function handleHeartClick(){}`์ด ๋๋๋ก ํธ์ถํด์ผ ํ๋๋ฐ, ์ด ํจ์๊ฐ ์์ component์ ์์ผ๋ฏ๋ก ๋ถ๋ชจ component์ธ const App์ผ๋ก ์ด๋
// STEP 3. ๋ถ๋ชจ component์์ function handleHeartClick(){}์ `setFavorites`๋ฅผ ์ค์
// STEP 4. MainCard๋ {handleHeartClick}์ props๋ก ๋ฐ์์ ๋ฒํผ์ onClick์ ์ ์ฉ
<body>
<div id="app"></div>
<script
src="https://unpkg.com/react@17/umd/react.development.js"
crossorigin></script>
<script
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
crossorigin></script>
<script
src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script type="text/babel">
const MainCard = ({ img, handleHeartClick }) => {
return (
<div className="main-card">
<img src={img} alt="๊ณ ์์ด" width="400" />
<button onClick={handleHeartClick}>๐ค</button>
</div>
);
};
const App = () => {
const [favorites, setFavorites] = React.useState([CAT1, CAT2]);
function handleHeartClick() {
setFavorites([...favorites, CAT3]);
// setFavorites([...favorites, CAT3]) = setFavorites([CAT1, CAT2, CAT3])
}
return (
<div>
<MainCard img={mainCat} handleHeartClick={handleHeartClick} />
<Favorites favorites={favorites} />
</div>
);
};
const ์ฌ๊ธฐ = document.querySelector("#app");
ReactDOM.render(<App />, ์ฌ๊ธฐ);
</script>
</body>
React ๋ฌธ์ - ์น์ฌ์ดํธ์ React ์ถ๊ฐ
BABEL
MDN - Using Fetch
Git Hub - Public APIs
์บกํดํ๊ต - Asynchronous Processing, Call Back
์บกํดํ๊ต - Promise
์บกํดํ๊ต - Async์ Await
Inf Learn - Async์ Await
์บกํดํ๊ต - Webpack
Inf Learn - Webpack
React - ์๋ก์ด React ์ฑ ๋ง๋ค๊ธฐ : Create React App
์บกํดํ๊ต - Node.js์ NPM
Inf Learn - Node.js์ NPM