React

[React] ๊ธฐ์ดˆ

๋ฒผ๋ฆฌ01 2024. 5. 14. 18:06

๐Ÿ“Œํ™˜๊ฒฝ

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