๐ํ๊ฒฝ
Mac
VSCode
๐๋ฆฌ์กํธ๋?
์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ UI๋ฅผ ๊ตฌํํ ์ ์๋๋ก ๋๋๋ค. ๋ฐ๋ณต๋๋ ์ฝ๋ ์กฐ๊ฐ์ ์ปดํฌ๋ํธ๋ก ์ ์ํ์ฌ ์ฌ์ฌ์ฉํ ์ ์๊ณ , ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ฌ๋๋๋งํ์ฌ ํจ์จ์ ๋์ธ๋ค.
- Vanilla JS : HTML ํ๊ทธ๋ฅผ ๋จผ์ ๋ง๋ค๊ณ property๋ฅผ ์ค์ ํ ๋ค Javascript ์ฝ๋๋ก ํด๋น ํ๊ทธ๋ฅผ ๋ณ๊ฒฝํจ.
- React.js : ์์(Element)๋ฅผ ์ํ๋ ๋๋ก ์์ฑํ ๋ค HTML๋ก ๋ง๋ค์ด์ ๋ ๋๋งํจ.
const span = ReactDOM.createElement(
"span", // html ํ๊ทธ
{id : "id"}, // property
"Hello, I'm span" // innerText
);
์ด๋ ๊ฒ ์ง์ UI๋ฅผ ์์ฑํ ์ ์์ง๋ง JSX ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ HTML๊ณผ ์ ์ฌํ ํํ๋ก ๋ ์ฝ๊ฒ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
<!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 src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
const root = document.getElementById("root");
// ์ปดํฌ๋ํธ
// ๋ฐ๋์ ๋๋ฌธ์๋ก ์์ฑํ๋ค
function Button() {
return (
<button id="btn"
onClick = { () => console.log("Clicked!")}
style={ {backgroundColor : "tomato" } }>
Click me!
</button>
);
}
function Container() {
return (
<div>
<Button/>
</div>
);
}
ReactDOM.render(<Container/>, root);
</script>
`<div id="root"></div>` ์์ `Container` ์ปดํฌ๋ํธ๋ฅผ ReactDOM์ด ๋ฃ์ด์ค๋ค.
`render()`๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค๋ ์๋ฏธ. ํ๋ฉด์ ์ถ๋ ฅํจ.
๐์์ํ๊ธฐ
1. ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ node.js๊ฐ ํ์ํ๋ค. https://nodejs.org/en/download/package-manager์์ ๋ค์ด ๋ฐ์ ์ ์๋ค. (ํน์ brew๋ฅผ ์ด์ฉํ์ฌ ๋ค์ด ๋ฐ์ ์ ์๋ค. `brew install node@๋ฒ์ `)
* LTS : ๊ธฐ์ ์ ์ํด 3๋ ๊ฐ ์ง์ํ๋ ๋ฒ์ . ์๋ฒ๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํด์ผํ๋ ๊ฒฝ์ฐ.
* Current : ์ต์ ๊ธฐ๋ฅ์ ๋ด๊ณ ์์. ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
2. ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ ๋ค. ์ํ๋ ์์น์ ํด๋๋ฅผ ๋ง๋ค๊ณ , ํด๋น ํด๋์์ ํฐ๋ฏธ๋์ ์ผ ๋ค. (ํน์ cd ๊ฒฝ๋ก ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ํด๋น ํด๋๋ก ์ง์ ํ๋ค.) `npx create-react-app ํ๋ก์ ํธ๋ช ` ์ ์ ๋ ฅํ๋ฉด Create React app์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋ฆฌ์กํธ ํ๋ก์ ํธ๊ฐ ๋ง๋ค์ด์ง๋ค.
* ํด๋๋ฅผ ์์ฑํ์ง ์๊ณ ์ํ๋ ๊ฒฝ๋ก์์ `npx create-react-app ํ๋ก์ ํธ๋ช ` ์ ์ ๋ ฅํ๋ฉด `ํ๋ก์ ํธ๋ช `์ ํด๋๊ฐ ์์ฑ๋๋ฉด์ ๋ฆฌ์กํธ ํ๋ก์ ํธ๊ฐ ๋ง๋ค์ด์ง๋ค.
* ํน์ ์งํ ์ํฉ์์ ๋์ด์ ๋ค์ด๋ก๋๊ฐ ์ง์ ๋์ง ์๊ฑฐ๋ ํ๋ก์ ํธ๊ฐ ์จ์ ํ ๋ค์ด๋ก๋ ๋์ง ๋ชปํ๊ณ ์ข ๋ฃ๋๋ค๋ฉด, ์ธํฐ๋ท ์ฐ๊ฒฐ ๋๋ node ๋ฒ์ ์ ํ์ธํ๋ค. ์ด๋ฏธ ์คํ์ค์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๋ฉด ์ข ๋ฃ ํ ๋ค์ ๋ค์ด๋ก๋๋ฅผ ์๋ํ๋ค. ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ๋ณต๋๋ฉด ์ปดํจํฐ๋ฅผ ๊ป๋ค ์ผ๋ณด๋ ๊ฒ์ด ์ข๋ค.
`Happy hacking!`์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ๋จ๋ฉด ์๋ฃ๋์๋ค๋ ๋ป์ด๋ค. ํด๋น ํด๋๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ๋ก์ ํธ๊ฐ ์์ฑ๋์ด์๋ค. (blog๋ ์ฒ์ ๋ฆฌ์กํธ๋ฅผ ๋ค์ด๋ก๋ํ ๋ ์ค์ ํ ์ด๋ฆ)
vscode์์ ํ๋ก์ ํธ(ํด๋)๋ฅผ ์ด์ด์ค๋ค.
node_modules ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋ ๋ณด๊ดํจ
public static ํ์ผ ๋ณด๊ดํจ
src ์ฌ๊ธฐ๊ฐ ์ฝ๋ ์ง๋ ๊ณณ. app.js๊ฐ ๋ฉ์ธ ํ์ด์ง
package.json ํ๋ก์ ํธ ์ ๋ณด
๐๊ธฐ์ด ๋ฌธ๋ฒ
`App.js` ๋ด `App()`์ด๋ผ๋ ํจ์ ๋ด์ return๋ฌธ์ผ๋ก html์ ๋ฐํํ๋ ํํ๋ก ๋์ด์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์์ html์ ์ฌ์ฉํ๋ ํฌํํ ๋ฐฉ์์ฒ๋ผ ๋ณด์ธ๋ค. return๋ฌธ ๋ด์ html ํ๊ทธ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ jsx๋ฌธ๋ฒ์ผ๋ก, html๊ณผ ์ ์ฌํ์ง๋ง ๋ช๊ฐ์ง ์ฃผ์ํ ์ ์ด ์๋ค.
1. class๋ className์ผ๋ก ์์ฑํ๋ค.
2. ์ธ๋ผ์ธ style์ ์ฌ์ฉํ ๋๋ `style=" color : 'red' "` ๋์ `style = { { color : 'red'} }` ํํ๋ก ์ฌ์ฉํ๋ค.
3. ๋ณ์๋ return๋ฌธ ์์ ์ ์ธํ๊ณ , ๊ฐ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋ณ์ ๋์ useState๋ฅผ ์ฌ์ฉํ๋ค.
4. ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ปดํฌ๋ํธ์ return ๋ฌธ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ๋๋ ์ค๊ดํธ `{ }` ๋ฅผ ์ฌ์ฉํ๋ค.
๐๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง(Array Destructuring)
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด ๋ด์ ๊ฐ์ ์ผ๋ฐ ๋ณ์์ ํ ๋น(๋์คํธ๋ญ์ฒ๋ง: ๊ตฌ์กฐ ๋ถํด ํ ๋น)ํ๊ณ ์ถ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
const[] food = ["tomato", "chocolate", "sandwich"];
const a = food[0];
const b = food[1];
const c = food[2];
console.log(a) // tomato
console.log(b) // chocolate
console.log(c) // sandwich
ES6์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด๋ก๋ถํฐ ๊ฐ ์์์ ๊ฐ์ ๋ณ์ ๋ฆฌ์คํธ์ ๋์นญ์์ผ ํ ๋นํ ์ ์๋ค.
const[] food = ["tomato", "chocolate", "sandwich"];
const [a, b, c] = food;
console.log(a) // tomato
console.log(b) // chocolate
console.log(c) // sandwich
๋ค์ ์ฝ๋๋ ์ ๋ฌธ๋ฒ๊ณผ ๋์นํ๋ค.
const [a, b, c] = ["tomato", "chocolate", "sandwich"];
๐ Reference type useState ๊ฐ ๋ณ๊ฒฝํ๊ธฐ
array๋ object๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์๋ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๊ฐ์ง๋ ๋ณ์๋ก, ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ณ์(์ฃผ์๊ฐ)๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๋ฆฌ์กํธ ํน์ฑ์ state์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ๋ค์ ๋ ๋๋งํ์ง ์๊ธฐ ๋๋ฌธ์, `title[0] = '๋ณ๊ฒฝ๋ ๊ฐ';` ์ฒ๋ผ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ (์ฃผ์๋ ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฏ๋ก) html์ ๋ฐ์๋์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๊ธฐ์กด ๋ฐฐ์ด(ํน์ ๊ฐ์ฒด)๋ฅผ ๋ณต์ฌ(์์ ๋ณต์ฌ)ํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํด์ค ๋ค set ํด์ฃผ๋ฉด ์ฃผ์๊ฐ์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์กํธ๊ฐ ์ฌ ๋ ๋๋งํ๋ฉด์ html์ ๋ณ๊ฒฝ๋ ๊ฐ์ด ์ ์ฉ๋๋ค.
function App() {
let blogLogo = "React Blog";
let [title, setTitle] = useState([
"๋จ์ ์ฝํธ ์ถ์ฒ",
"๊ฐ๋จ ์ฐ๋ ๋ง์ง",
"ํ์ด์ฌ ๋
ํ",
]);
<div className="App">
<button
onClick={() => {
let copy = [...title];
copy[0] = "์ฌ์ ์ฝํธ ์ถ์ฒ";
setTitle(copy);
}}
>
์ ๋ชฉ ๋ณ๊ฒฝ
</button>
<div className="list">
<h4>
{title[0]}{" "}
<span
onClick={() => {
setLike(++like);
}}
>
๐
</span>
{like}
</h4>
<p>5์ 6์ผ ๋ฐํ</p>
</div>
<div className="list">
<h4> {title[1]} </h4>
<p>5์ 6์ผ ๋ฐํ</p>
</div>
<div className="list">
<h4> {title[2]} </h4>
<p>5์ 6์ผ ๋ฐํ</p>
</div>
</div>
);
}
๐Hook
hook์ React 16.8๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก ๊ธฐ์กด Class ๋ฐํ์ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์์ด ์ํ ๊ฐ๊ณผ ์ฌ๋ฌ React์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๋ฆฌ์กํธ ํจ์๋ฅผ ๋ปํ๋ค.(class ์์ด React๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.) ๊ณ์ธต์ ๋ณํ ์์ด ์ํ ๊ด๋ จ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋๋๋ค.
State Hook, Effect Hook๊ณผ ๊ฐ์ ๋ช๊ฐ์ง ๋ด์ฅ ํ ์ด ์กด์ฌํ๋ค.
๐useState
ํจ์ ์ปดํฌ๋ํธ ๋ด์์ ์ํ ๊ฐ์ ์ ์ํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๋ฆฌ์กํธ ๋ด๋ถ ํ .
๋ณ์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ์ผ๋ฐ ๋ณ์๋ ๋ณ๊ฒฝ๋์ด๋ ๋ ๋๋ง๋์ง ์๊ธฐ ๋๋ฌธ์ html์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค. useState๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ ๋๋งํด์ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ณด์ฌ์ฃผ๋ฏ๋ก, ๊ฐ์ด ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด useState๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
useState๋ innerText, id, class ๋ชจ๋ ๊ณณ์ ์ฌ์ฉํ ์ ์๋ค.
let [title, setTitle] = useState('๋ฆฌ์กํธ');
์์ ๊ฐ์ด ์ ์ธํ๋ฉด `{title}` ๊ณผ ๊ฐ์ด ๋ณ์ ์ด๋ฆ์ผ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด `setTitle()`์ ์ฌ์ฉํ๋ค.
import React, { useState } from 'react';
function Example() {
// "count"๋ผ๋ ์ ์ํ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
๊ฐ๊ณผ ๊ฐ์ ๋ณ๊ฒฝํ๋ ํจ์(setter)๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ๊ฐ๊ฐ ๋์คํธ๋ญ์ฒ๋งํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ ์ฝ๋์์ `count`์ ์ด๊ธฐ ๊ฐ์ 0์ด ๋๋ฉฐ `setCount()`๋ก `count`์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
`let` ๋๋ `const`์ ๊ฐ์ ์ผ๋ฐ ๋ณ์์ ๊ฒฝ์ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์ด๊ธฐ ํ ๋น๋ ๊ฐ๋ง ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์ง์ `ReactDOM.render()`ํจ์๋ฅผ ํธ์ถํด์ผ๋ง ๋ณ๊ฒฝ๋ ๊ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ค ์ ์์ง๋ง, `useState`๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ธํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ์์ฑ๋๋ฉด์ ๋ฆฌ์กํธ๊ฐ ๋ณ๊ฒฝ๋ ์๋ก์ด ๊ฐ์ ๊ฐ์ง๊ณ ๋ ๋๋งํ๋ค.
๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ ๋๋งํ๋ค!
๐์ปดํฌ๋ํธ
์ปดํฌ๋ํธ๋ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝ๋ ๋ญ์น๊ฐ ์์ ๋ ๋ฏธ๋ฆฌ ์ ์ธํ๋ ์ฉ๋๋ก ์ฌ์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ html์ ์ถ์ฝํ ์ ์๋ค. ๋ฉ์ธ ํจ์(`function App() {}`) ๋ฐ๊นฅ์ ํจ์ ํ์์ผ๋ก ์ ์ธํ๊ณ , ์ฌ์ฉ์ ์ ์ ํ๊ทธ์ฒ๋ผ ์ฌ์ฉํ๋ค.
๋จ, ๋ฆฌ์กํธ๊ฐ ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒ๋ง ์ปดํฌ๋ํธ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋๋ฌธ์๋ก ์ ์ธํ๋ค.
function App() {
return (
<div className="App">
<Modal/>
</div>
);
}
function Modal() {
return (
<div className="modal">
<h4>์ ๋ชฉ</h4>
<p>๋ ์ง</p>
<p>์์ธ ๋ด์ฉ</p>
</div>
);
}
๐Props
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ๋ ๊ฐ. ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ด์ ์์ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ , ์์ฑ์ ์ ์ํ๋ฉด ์์ ์ปดํฌ๋ํธ์์ props ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋๊ฒจ ๋ฐ์ ๋ด๋ถ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
// ์์ ์ปดํฌ๋ํธ
function Btn({text, fontSize = 12}) {
return (
<button
style={ {
backgroundColor : "tomato",
color : "white",
padding : "10px 20px",
border : 0,
borderRadius : 10,
fontSize : fontSize,
} }>
{text}
</button>
);
}
// ๋ถ๋ชจ ์ปดํฌ๋ํธ
function App() {
return (
<div>
<Btn text="Continue" fontSize={18}/>
<Btn text="hello!" fontSize={15}/>
</div>
);
}
์ด๋ `props`์ ๊ฐ์ ์๋ชป ์ ์ธํ์ฌ ์ ๋ฌํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด `PropsType`์ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ ์ง์ ํด์ฃผ๋ฉด React๊ฐ ์ค๋ฅ๋ฅผ ์ธ์งํ๋ค.
Btn.propTypes = {
text : PropTypes.string.isRequired,
fontSize : PropTypes.number
}
`PropsType`์ `string`, `number` ๋ฑ ์๋ฃํ ์ด์ธ์ ํจ์๋ ์ ๋ฌํ ์ ์๊ณ , `isRequired`๋ก ๋ฐ๋์ ๊ฐ์ ๋ฐ๋๋ก ์ค์ ํ ์๋ ์๋ค.
๐useEffect
์ปดํฌ๋ํธ์ ์ด๋ค ๋ณํ๊ฐ ์์ ๋ ํน์ ํจ์์ ๋ํ ์คํ์ ์ ์ดํ๋ ํ . ๋ฆฌ์กํธ๋ ๋ณํํ๋ ๋ถ๋ถ์ ๊ฐ์งํ์ฌ ์ต์ ๋จ์๋ก ์ฌ๋ ๋๋งํ๋๋ฐ, API๋ฅผ ํธ์ถํ๋ ๋ฑ ํ๋ฒ๋ง ์คํ๋๊ฑฐ๋ ํน์ ๊ฒฝ์ฐ์๋ง ์คํํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ฅ์ด ๋ถํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ ์ฌ๋ ๋๋ง์ ๋ง๊ธฐ ์ํด `useEffect`๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ฒซ๋ฒ์งธ ์ธ์๋ ์คํํ ํจ์๋ฅผ ๋ฃ๊ณ , ๋๋ฒ์งธ ์ธ์๋ `dependency List`๋ฅผ ๋ฃ๋๋ค. ๋๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด `useEffect`๊ฐ ์๋ฌด๊ฒ๋ ๋ณด๊ณ ์์ง ์์ผ๋ฏ๋ก(๋ณํ๋ฅผ ๊ฐ์งํ์ง ์์ผ๋ฏ๋ก) ํ์ด์ง๊ฐ ๋ ๋๋ง ๋ ๋ ๋ฑ ํ๋ฒ๋ง ์คํ๋๋ค.
`input` ์ฐฝ ๋ด๋ถ์ ๊ฐ์ด ๋ณํํ ๋๋ง ์คํํ๊ณ ์ถ์ ํจ์๊ฐ ์๋ค๋ฉด, ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import { useState } from "react";
import { useEffect } from "react";
function App() {
const [keyword, setKeyword] = useState("");
function onChange(event) {
setKeyword(event.target.value);
}
useEffect(() => {
console.log("Search for ", keyword);
}, [keyword]);
return (
<div>
<input
value={keyword}
onChange={onChange}
type="text"
placeholder="Search Here..."
/>
</div>
);
}
export default App;
`onChange` ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ `input`์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ , `onChange` ํจ์๋ฅผ ์คํํ์ฌ `setKeyword()`๋ก `keyword`์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค. `useEffect`๊ฐ `keyword`์ ๋ณํ๋ฅผ ๊ฐ์งํ์์ผ๋ฏ๋ก, `console.log()`๊ฐ ์คํ๋๋ค.
๐CleanUp ํจ์
์ปดํฌ๋ํธ๊ฐ ํ๊ดด๋๊ฑฐ๋ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ง์ ์ ์คํ๋๋ ํจ์. `useEffect`์ ์ฒซ๋ฒ์งธ ์ธ์์ ๋ค์ด๊ฐ๋ ํจ์์ `return`๋ฌธ์ ์์ฑํ๋ค.
`showing`์ ์ฐธ๊ณผ ๊ฑฐ์ง์ ๋ฐ๋ผ `<Hello>` ์ปดํฌ๋ํธ๋ฅผ ๋ณด์๋ค ์ ๋ณด์๋ค(์์ฑ ๋๋ ํ๊ดด)ํ๋ ์์ ์ด ์์ ๋, ์ปดํฌ๋ํธ์ ์์ฑ๊ณผ ํ๊ดด ์์ ํน์ ๋์์ ์คํํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
import { useState } from "react";
import { useEffect } from "react";
function App() {
const [showing, setShowing] = useState(false);
function onClick() {
setShowing((prev) => !prev);
}
function Hello() {
useEffect(() => {
console.log("hi!");
return () => console.log("bye!");
}, []);
return <div>Hello!</div>;
}
return (
<div>
<button onClick={onClick}>{showing ? "Hide" : "Show"}</button>
{showing ? <Hello /> : null}
</div>
);
}
export default App;
๐์ฐธ๊ณ
ReactJS๋ก ์ํ ์น ์๋น์ค ๋ง๋ค๊ธฐ – ๋ ธ๋ง๋ ์ฝ๋ Nomad Coders
React for Beginners
nomadcoders.co
Hook์ ๊ฐ์ – React
A JavaScript library for building user interfaces
ko.legacy.reactjs.org
Destructuring | PoiemaWeb
๋์คํธ๋ญ์ฒ๋ง(Destructuring)์ ๊ตฌ์กฐํ๋ ๊ฐ์ฒด(๋ฐฐ์ด ๋๋ ๊ฐ์ฒด)๋ฅผ Destructuring(๋น๊ตฌ์กฐํ, ํ๊ดด)ํ์ฌ ๊ฐ๋ณ์ ์ธ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ด๋ค. ๋ฐฐ์ด ๋๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ํ์ํ ๊ฐ๋ง์ ์ถ์ถํ์ฌ ๋ณ์์ ํ
poiemaweb.com
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Can't resolve 'queryString' in ... (0) | 2025.03.13 |
---|---|
[React] ๋ฆฌ๋์ค(Redux) (0) | 2025.03.04 |
[React] To-do list ๋ง๋ค๊ธฐ (0) | 2024.05.27 |