(0) ํ๊ฒฝ ์ค์ ๋ฐ base code ์ง๊ธฐ
(1) hook ์ฌ์ฉํด๋ณด๊ธฐ(useState)
(2) components ์ฌ์ด์ data sharingํ๋ ์์
์ ํด๋ณธ๋ค.
๊ฐ (0), (1), (2) ๋ชฉํ๋ ๊ฐ ์ค์ต์ ๋ฐ๋ผ ์ด๋ค์ง๋ค.
Nodejs ์ค์นํ๊ธฐ & npm ์ค์นํ๊ธฐ & npx ์ค์นํ๊ธฐ
https://nodejs.org/en ์์ LTS ๋ฒ์ ๋ค์ด๋ก๋ ํ ์ค์น(๋ํดํธ ์ค์ )
node -v
์
๋ ฅ ํ ๋ฒ์ ํ์ธnpm -v
์
๋ ฅ ํ ๋ฒ์ ํ์ธcmd ์ฐฝ์์ ์๋ ์ ๋ ฅ
npm install -g create-react-app
npx create-react-app yum
or playcode.io/react ์์ ์์ ํ๊ธฐ
App.js
import logo from "./logo.svg";
import "./App.css";
import React, { useState } from "react";
function Counter() {
const counter = 0;
return (
<div className="Counter-Wrapper">
<div>COUNTER: {counter}</div>
<button>+1</button>
<button>-1</button>
</div>
);
}
function App() {
return (
<div className="App">
<Counter />
</div>
);
}
export default App;
App.css
.App {
text-align: center;
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.Counter-Wrapper {
margin-bottom: 15px;
}
.Counter-Wrapper > div {
border: 1px solid white;
padding: 5px;
border-radius: 5px;
}
.Counter-Wrapper > button {
margin-top: 15px;
margin-left: 10px;
min-height: calc(10px + 3vmin);
min-width: calc(10px + 5vmin);
font-size: calc(5px + 2vmin);
}
COUNTER๊ฐ ์ฆ๊ฐํ๊ณ , ๊ฐ์ํ๋๋ก ํจ์ Counter๋ฅผ ์์ฑํด ์ค๋ค.
โฒ๏ธ ๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๊ฐ ๋ณํด ์น ๋ธ๋ผ์ฐ์ ์์ ์ค์ DOM์ ์
๋ฐ์ดํธํ ๋ ๋ฐ๋ 3๊ฐ์ง ์ ์ฐจ โฒ๏ธ
๊ทธ๋์ ์๊น [๊ทธ๋ฆผ 1-6]์ ๋ฐ๋ DOM ํธ๋ฆฌ๊ฐ ๊ทธ VIrtual DOM ํธ๋ฆฌ๋ก ํ์ธํ๋ ๊ฒ์.
useState
: state์ state์ ๋ณ๊ฒฝํ ์ ์๋ ํจ์๋ฅผ ์ ๊ณตํด์ค๋ค. state๊ฐ ์์ด์ผ ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ๋ ๊ฐ์ด ๊ฐ์ง๋๊ณ , ๋ฆฌ๋ ๋๋จ(reconciliation ๊ณผ์ ).// ์์
import React, { useState } from "react";
function App() {
const [counter, setCounter] = useState(0);
return (
<div className="App">
{counter}
</div>
);
}
onClick
: button ๊ณผ ๊ฐ์ ํ์ด์ง ์์์์ event ๋ฐ์ ์ ํธ์ถ๋๋ ํจ์ ์ค ํ๋. ํ๋ง๋๋ก, button ํด๋ฆญ ์ ํธ์ถ๋๋ ์ด๋ฒคํธ ํจ์๋ค.<button onClick={()=>{console.log("+1 clicked")}>+1</button>
// ์ฌ๊ธฐ์ ()=>{}๋ ํ์ดํ ํจ์(JS ๋ฌธ๋ฒ)๋ค. onClick ์ด๋ฒคํธ ๋ฐ์ ์ ํธ์ถ๋๋ ํจ์.
์ ์ฌ์ง๊ณผ ๊ฐ์ด +1 ํน์ -1 ๋ฒํผ ํด๋ฆญ ์, ํด๋น ๊ฒฐ๊ณผ๊ฐ๋งํผ ํน์ ๋ฌธ์์ด์ด ๋ฐ๋ณต๋๋๋ก ํ๋ค.
props
์ ๋ฌ: ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ๋ ์ธ์๋ก ์ ๋ฌํ๋ค. ์ด๋ ์ธ์๋ฅผ ์๋ฏธ. ๊ทธ๋ฐ๋ฐ ์ธ์๋ก ํจ์๋ ์ ๋ฌํ ์ ์๋ค!function Counter({ counter, setCounter }) {
// ...
}
// ํน์
function Counter(props) {
const counter = props.counter;
const setCounter = props.setCounter;
// ...
}
function App() {
const [counter, setCounter] = useState(0);
return (
<div className="App">
<Counter counter={counter} setCounter={setCounter} />
</div>
);
}
Often youโll need components to share data and always update together.
To make both MyButton components display the same count and update together, you need to move the state from the individual buttons โupwardsโ to the closest component containing all of them.