๐Ÿ” React.js ์ž…๋ฌธ

๊น€์ˆ˜์ง„ยท2025๋…„ 7์›” 5์ผ

ํ•œ ์ž… ํฌ๊ธฐ๋กœ ์ž˜๋ผ ๋จน๋Š” ๋ฆฌ์•กํŠธ ์„น์…˜ 6 - React.js ์ž…๋ฌธ

React ์‹ค์Šต ์ค€๋น„

ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

npm create vite@latest
Project name:
Select a framework: React

ํŒŒ์ผ ๋“ค์–ด๊ฐ€๊ธฐ

npm install
npm run dev

ํ•„์š”์—†๋Š” ์ฝ”๋“œ ์‚ญ์ œํ•˜๊ธฐ

import reactLogo from './assets/react.svg'
import voteLogo from '/vite.svg' 

src์˜ App.jsx์—์„œ ์‚ญ์ œ

src App.css ๊ธฐ๋ณธ ์Šคํƒ€์ผ ๊ฐ’ ๋ชจ๋‘ ์‚ญ์ œํ•˜๊ธฐ

eslint ํ”Œ๋Ÿฌ๊ทธ์ธ

์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ •์ ์œผ๋กœ ๊ฒ€์‚ฌํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋งŒํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋„์›Œ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ


ํŒŒ์ผ์„ ๋“ค์–ด๊ฐ€๋ณด๋ฉด enslint ํŒŒ์ผ์ด ์ƒ๊ฒผ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

React ์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ: html์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
์ฃผ์˜์ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ์ฒซ ๊ธ€์ž๊ฐ€ ๋Œ€๋ฌธ์ž๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

const Header = () => {
	return(
    	<header>
        	<h1>header</h1>  // ์ž์‹ ์ปดํฌ๋„ŒํŠธ
        <header>
    };
};

fucntion App() {
	return (
		<>
        	<Header />  // Header ์ถœ๋ ฅ ์ฝ”๋“œ
            <h1> ์•ˆ๋…• ๋ฆฌ์•กํŠธ!!</h1>  // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
        </>
    };
}

์˜ˆ์ œ์—์„œ App ์ปดํฌ๋„ŒํŠธ๋Š” root component์ด๋‹ค!

์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ import ํ•ด๋ณด์ž

const Header = () => {
	return(
    	<header>
        	<h1>header</h1>  // ์ž์‹ ์ปดํฌ๋„ŒํŠธ
        <header>
    };
};

export default Header; //์ถ”๊ฐ€ํ•˜๊ธฐ

Header.jsx ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ

import "./App.css";
import Header from "./components/Header.jsx"; //์ถ”๊ฐ€ํ•˜๊ธฐ(.jsx๋Š” ์ƒ๋žต ๊ฐ€๋Šฅ)

fucntion App() {
	return (
		<>
        	<Header />  
            <h1> ์•ˆ๋…• ๋ฆฌ์•กํŠธ!!</h1>  // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ
        </>
    };
}

export default App;

App.jsx ํŒŒ์ผ์—์„œ import๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

JSX - UI ํ‘œํ˜„ํ•˜๊ธฐ

const Main = () => {
	const number = 10;
    
	return(
    	<main>
        	<h1>main</h1> 
            <h2>{number}</h2> //{} ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€๊ฑฐ ์ž‘์„ฑ
        </main>
    };
};

jsx ๋ฌธ๋ฒ•์—์„œ javascript ๊ฐ’์„ html์— ๋žœ๋”๋ง ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด {} ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์€๊ฑฐ ์ž‘์„ฑ
์‚ผํ•ญ์—ฐ์‚ฐ์ž(number % 2 ===0 ? "์ง์ˆ˜" : "ํ™€์ˆ˜")๋„ {}์•ˆ์— ๋„ฃ์–ด์„œ ์ถœ๋ ฅ ๊ฐ€๋Šฅํ•˜๋‹ค.

JSX ์ฃผ์˜ ์‚ฌํ•ญ

  1. ์ค‘๊ด„ํ˜ธ ๋‚ด๋ถ€์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

  2. ์ˆซ์ž & ๋ฌธ์ž์—ด & ๋ฐฐ์—ด๋งŒ ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•˜๋‹ค.
    ๊ฐ์ฒด ๋žœ๋”๋ง ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  3. ๋ชจ๋“  ํƒœ๊ทธ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค.

<img>
</img>
  1. ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

JSX ๋ฌธ๋ฒ•์—์„œ ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฐ๊ฐ ๋‹ค๋ฅธ UI๋ฅผ ๋žœ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•

์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์ด์šฉ

const Main = () =>{
	const user = {
    	name:"๊น€์ˆ˜์ง„"
        isLogin: false,
    };
	return {
    	<>
        	{user.isLogin ? {
            	<div>๋กœ๊ทธ์•„์›ƒ</div>
            } : {
            	<div>๋กœ๊ทธ์ธ</div>
            }}
    	</>;
    };
};

์กฐ๊ฑด๋ฌธ ์ด์šฉ

const Main = () =>{
	const user = {
    	name:"๊น€์ˆ˜์ง„"
        isLogin: false,
    };
    
if (user.isLogin) {
	return <div>๋กœ๊ทธ์•„์›ƒ</div>;
} else {
	return <div>๋กœ๊ทธ์ธ</div>;
}

JSX์—์„œ ์Šคํƒ€์ผ ์ ์šฉ ๋ฐฉ๋ฒ•

์นด๋ฉœ์ผ€์ด์Šค: ์—ฐ๊ฒฐ๋˜๋Š” ์ฒซ๋ฒˆ์งธ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•

backgroundColor:"red"

๋”ฐ๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ

.logout{
	background-color: red;
    .
    .
    .
}

main.cssํŒŒ์ผ์— main.jsx ์—์„œ `import "./Main.css";๋ฅผ ํ•œ ํ›„, div์—์„œ

์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์ฃผ๋ฉด ์ ์šฉ์ด ๋œ๋‹ค.

Props๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ

props๋ž€?
์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ๋œ ๊ฐ’

<Button text={"๋ฉ”์ผ"} img={"mail.png"} /> //text={"๋ฉ”์ผ"} img={"mail.png"} ์ด ๋ถ€๋ถ„์ด props๋‹ค.
import Button from "./components/Button";

function App() {
	return (
		<>
			<Button text={"๋ฉ”์ผ"}/>
			<Button text={"์นดํŽ˜"}/>
			<Button text={"๋ธ”๋กœ๊ทธ"}/>
		</>
	);
}

App.jsx์—์„œ Button ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•ด์ค€๋‹ค.

const Button = (props)=> {
	console.log(props);
		return <button>ํด๋ฆญ</button>
};

Button.jsx์— props๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

props ๋””ํดํŠธ ๊ฐ’ ์„ค์ •

props์˜ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์ค˜์•ผํ•œ๋‹ค.

const Button = ({ text, color = "black"}) => {
	return {
		<button style = {{color: color}}>
			{text}-{color.toUpperCase()}
		</button>
	};
};

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž (์†์„ฑ์„ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ)

import Button from "./components/Button";

function App() {
  const buttonProps = {
    text :"๋ฉ”์ผ",
    color: "red", 
    a: 1,
    b: 2,
    c: 3, 
  };
  
  return (
      <>
          <Button {...buttonProps}/> //์ค‘์š”
          <Button text={"์นดํŽ˜"}/>
          <Button text={"๋ธ”๋กœ๊ทธ"}/>
      </>
  );
}

์†์„ฑ์ด ๋งŽ์€ ๊ฒฝ์šฐ ๊ฐ์ฒด๋กœ ์˜ฎ๊ธฐ๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค.

children props

html react ์ปดํฌ๋„ŒํŠธ๋„ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

  return (
      <>
          <Button {...buttonProps}/> 
          <Button text={"์นดํŽ˜"}/>
          <Button text={"๋ธ”๋กœ๊ทธ"}/>
          	<div>์ž์‹์š”์†Œ </div>
          </Button>
      </>
  );
}

App.jsx ํŒŒ์ผ์— divํƒœ๊ทธ๋ฅผ ๋ฐฐ์น˜์‹œํ‚ค๋‹ค.

const Button = ({children, text, color = "black"}) => {
	return {
		<button style = {{color: color}}>
			{text}-{color.toUpperCase()}
            {children}
		</button>
	};
};

Button.jsx ์—์„œ children ์ž‘์„ฑํ•˜๊ธฐ

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

Event Handling: ์›น ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์ฒ˜๋ฆฌํžˆ๋Š” ๊ฒƒ

const Button = ({children, text, color = "black"}) => {
	const onClickButton = () => {
    	console.log(text);
    };
    
	return {
		<button 
          onClick = {onClickButton}
          style = {{color: color}}
        >
			{text}-{color.toUpperCase()}
            {children}
		</button>
	};
};

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์–ด๋– ํ•œ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒ๋˜๋„๋ก ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

์ด๋ฒคํŠธ ๊ฐ์ฒด

ํ•ฉ์„ฑ ์ด๋ฒคํŠธ ๊ฐ์ฒด

๋ชจ๋“  ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋กœ ํ†ต์ผํžŒ ํ˜•ํƒœ

const Button = ({children, text, color = "black"}) => {
	const onClickButton = (e) => {
    	console.log(e);  //SyntheticBaseEvent ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค.
    	console.log(text);
    };
    
	return {
		<button 
          onClick = {onClickButton}
          style = {{color: color}}
        >
			{text}-{color.toUpperCase()}
            {children}
		</button>
	};
};

State๋กœ ์ƒํƒœ๊ด€๋ฆฌํ•˜๊ธฐ

State ๋ž€?
ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜•ํƒœ๋‚˜ ๋ชจ์–‘์„ ๋œปํ•œ๋‹ค.
๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ ์ธ ๊ฐ’์ด๋‹ค.

import "./App.css";
import {useState} from "react";

function App() {
  const [state, setState] = useState(0); //state๊ฐ’, setState: state๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” 

  return 
  	<>
  		<h1>{state}</h1>
  	</>;
  };
}

Re-Render / Re-Rendering: state๊ฐ€ ๋ฐ”๋€Œ๋ฉด์„œ ์ปดํผ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ์ƒํ™ฉ

import "./App.css";
import {useState} from "react";

function App() {
  const [state, setState] = useState(0); 

  return //state๊ฐ€ return๋ฌธ์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋จ
  	<>
  		<h1>{state}</h1>
        <button 
        	onCLick ={() => {
				setState(state + 1); 
            }}
         >
         + 
         </button>
  	</>;
  };
}

state๊ฐ€ return๋ฌธ์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

๋„๊ธฐ ์ผœ๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

import "./App.css";
import {useState} from "react";

function App() {
  const [state, setCount] = useState(0); 
  const [light, setLight] = useState("OFF");

  return {
  	<>
    <div>
        <h1>{light}</h1>
        <button
            onClick={() => {
                setLight(light === "ON" ? "OFF" : "ON");
            }}
     >
            {{light === "ON" ? "๋„๊ธฐ" : "์ผœ๊ธฐ"}
         </button>
      </div>
      <div>
         <h1>{count}</h1>
         <button
            onCLick = {() => {
                setCount(count + 1);
             }}
         >
            +
         </button>
  	</>;
  };
}

State์™€ Props

state๋ฅผ props๋ฅผ ์ด์šฉํ•ด์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•
์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” props์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค.
react ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ด ๊ฐ–๊ณ  ์žˆ๋Š” state๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„๋„ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” props ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด re-rendering์ด ๋œ๋‹ค.

react ์ปดํฌ๋„ŒํŠธ๊ฐ€ re-rendering ๋˜๋Š” ์ƒํ™ฉ
1. ์ž์‹์ด ๊ด€๋ฆฌํ•˜๋Š” state์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ์ด๋‹ค.
2. ์ž์‹์ด ์ œ๊ณต๋ฐ›๋Š” props์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ์ด๋‹ค.
3. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ re-rendering์ด ๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ re-rendering ๋œ๋‹ค.

์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ  ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.
=> ๋”ฐ๋ผ์„œ ๊ด€๋ จ ์—†๋Š” ๋‘๊ฐœ์˜ state๋ฅผ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋ชฐ์•„๋„ฃ๊ธฐ๋ณด๋‹ค ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

function App(){
  const [count, setCount] = useState(0);
  const [light, setLight] = useState("OFF");

์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ re-rendering ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

const Counter ()=>{
  const [count, setCount] = useState(0);
  return ๋ฌธ
  .
  .
  .
}
const Bulb = () => {
  const [light, setLight] = useState("OFF");
  
  return ๋ฌธ
  .
  .
  .

๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•œ ์ฝ”๋“œ์ด๋‹ค.

State๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ด€๋ฆฌํ•˜๊ธฐ 1

๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž… ํผ
1. ์ด๋ฆ„
2. ์ƒ๋…„์›”์ผ
3. ๊ตญ์ 
4. ์ž๊ธฐ์†Œ๊ฐœ

const Register = () => {
	const [name, setName] = useState("์ด๋ฆ„");
    const [birth, setBirth] = useState("");
    const [country, setCountry] = useState("");
    const [bio, setBio] = useState("");

	const onChangeName = (e) => {
		setName(e.target.value);
	};
	const onChangeBirth = (e) => {
    	setBirth(e.target.value);
    };
    const onChangeCountry = (e) => {
    	setCountry(e.target.value);
    };
    const onChangeBio = (e) => {
    	setBio(e.target.value);
    };
    
    
	return {
		<div>
			<input 
              value={name} // ์ด๋ฆ„ ๊ด€๋ฆฌํ•˜๊ธฐ
              onChange={onChangeName}
			  placeholder={"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} // ์ƒ์ผ ๊ด€๋ฆฌํ•˜๊ธฐ
              onChange={onChangeBirth}
			  type: "date"
        
        <div>
        	<select value = {country} onChange={onChangeCountry}> //๊ตญ์ 
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={bio} onChange={onChangeBio} />
            {bio}
        </div>
     </div>   
	);
};

State๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ด€๋ฆฌํ•˜๊ธฐ 2

const Register = () => {
    const [input, setInput] = useState({
    	name = "", 
        birth = "", 
        country = "", 
        bio = "", 

	const onChangeName = (e) => {
		setInput({
        	...input,
            name : e.target.value
        })
	};
	const onChangeBirth = (e) => {
		setInput({
        	...input,
            birth : e.target.value
        })
	};
    const onChangeCountry = (e) => {
		setInput({
        	...input,
            country : e.target.value
        })
	};
    const onChangeBio = (e) => {
		setInput({
        	...input,
            bio: e.target.value
        })
	};
    
    
	return (
		<div>
			<input 
              value={input.name} // ์ด๋ฆ„ ๊ด€๋ฆฌํ•˜๊ธฐ
              onChange={onChangeName}
			  placeholder = {"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} // ์ƒ์ผ ๊ด€๋ฆฌํ•˜๊ธฐ
              onChange={onChangeBirth}
			  placeholder = {"์ƒ์ผ"}
             />
		</div>
            
        
        <div>
        	<select value = {input.country} onChange={onChangeCountry}> //๊ตญ์ 
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={input.bio} onChange={onChangeBio} />
            {bio}
        </div>
     </div>   
	);
};

...input spread์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?
๊ด€๋ จ์—†๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ’์„ ์œ ์ง€์‹œํ‚ค๊ธฐ ์œ„ํ•ด

ํ•˜๋‚˜์˜ ํ”„๋กœํผํ‹ฐ๊ฐ’๋งŒ ๋ฐ”๋€Œ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

ํ†ตํ•ฉ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ

const Register = () => {
    const [input, setInput] = useState({
    	name = "", 
        birth = "", 
        country = "", 
        bio = "", 

	const onChangeName = (e) => {
		setInput({
        	...input,
            [e.target.name] : e.target.value
        });
	};
        
	return (
		<div>
			<input 
              value={input.name} 
              onChange={onChange} //๋ฐ”๋€๋ถ€๋ถ„!
			  placeholder = {"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} 
              onChange={onChange} //๋ฐ”๋€๋ถ€๋ถ„!
			  type: "date"
             />
		</div>
            
        
        <div>
        	<select value = {input.country} onChange={onChange}> //๋ฐ”๋€๋ถ€๋ถ„!
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={input.bio} onChange={onChange} /> //๋ฐ”๋€๋ถ€๋ถ„!
            {bio}
        </div>
     </div>   
	);
};

input, select ๋“ฑ ๋ชจ๋“  trxtarea์˜ onChange๋ผ๋Š” ํ†ตํ•ฉ์ด๋ฒคํŠธ๋ฅผ ์„ค์น˜ํ•ด๋‘์—ˆ๋‹ค.

useRef๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ

useRef๋ž€? ์ƒˆ๋กœ์šด Reference ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

const refObject = useRef()

refObject ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜์ด๋‹ค.

useRef vs useState

useRef :
reference ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.
useState:
State๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๋กœ ํ™œ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•œ๋‹ค.

import {useState, useRef} from "react";

const Register = () => {
    const [input, setInput] = useState({
    	name = "", 
        birth = "", 
        country = "", 
        bio = "", 
    const refObj = useRef(); // ์ƒˆ๋กœ์šด ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด ์ƒ์„ฑ
	console.log("Register ๋ Œ๋”๋ง"); // ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค. 
    
	const onChangeName = (e) => {
		setInput({
        	...input,
            [e.target.name] : e.target.value
        });
	};

        
	return (
    	<div>
        	<button
            	onCLick = {() => {
                	refObj.current++;
                    console.log(refObj.current());
                }}
            >
            	ref +1 
            </button>
            
		<div>
			<input 
              value={input.name} 
              onChange={onChange} 
			  placeholder = {"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} 
              onChange={onChange} 
			  type: "date"
             />
		</div>
            
        
        <div>
        	<select value = {input.country} onChange={onChange}> 
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={input.bio} onChange={onChange} /> 
            {bio}
        </div>
     </div>   
	);
};

useRef๋Š” ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด ํ™œ์šฉ ์‚ฌ๋ก€ 1

import {useState, useRef} from "react";

const Register = () => {
    const [input, setInput] = useState({
    	name = "", 
        birth = "", 
        country = "", 
        bio = "", 
    const countRef = useRef(); 
    console.log("Register ๋ Œ๋”๋ง");
    
	const onChangeName = (e) => {
		countRef.current ++;
        console.log(countRef.current);
        setInput({
        	...input,
            [e.target.name] : e.target.value
        });
	};
   
        
	return (
     <div>
		<div>
			<input 
              value={input.name} 
              onChange={onChange} 
			  placeholder = {"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} 
              onChange={onChange} 
			  type: "date"
             />
		</div>
            
        
        <div>
        	<select value = {input.country} onChange={onChange}> 
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={input.bio} onChange={onChange} /> 
            {bio}
        </div>
     </div>   
	);
};

์ˆ˜์ •ํ• ๋•Œ๋งˆ๋‹ค count๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด ํ™œ์šฉ ์‚ฌ๋ก€ 2

import {useState, useRef} from "react";

const Register = () => {
    const [input, setInput] = useState({
    	name = "", 
        birth = "", 
        country = "", 
        bio = "", 
    const countRef = useRef(0); 
    const inputRef = useRef(); //๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด ์ƒ์„ฑ
    
	const onChangeName = (e) => {
		countRef.current ++;
        console.log(countRef.current);
        setInput({
        	...input,
            [e.target.name] : e.target.value
        });
	};
    
    const onSubmit = () => {
    	if(input.name=== ""){
          // ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” DOM ์š”์†Œ ํฌ์ปค์Šค
          inputRef.current.focus();
        }
    };

        
	return (
     <div>
		<div>
			<input 
              ref = {inputRef} //๋ Œ๋”๋งํ•˜๊ฒŒ ๋˜๋ฉด inputRef ๋ ˆํผ๋Ÿฐ์Šค object์— ์ €์žฅ์ด ๋œ๋‹ค.
              value={input.name} 
              onChange={onChange} 
			  placeholder = {"์ด๋ฆ„"}
             />
		</div>
        
        <div>
        	<input
              value={input.birth} 
              onChange={onChange} 
			  type: "date"
             />
		</div>
            
        
        <div>
        	<select value = {input.country} onChange={onChange}> 
            	<option></option>
                <option>ํ•œ๊ตญ</option> 
                <option>๋ฏธ๊ตญ</option>
                <option>์˜๊ตญ</option>
            </select>
            {country}
        </div>
        
        <div>
        	<textarea value={input.bio} onChange={onChange} /> 
            {bio}
        </div>
     </div>   
	);
};

์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋Š” DOM์š”์†Œ์— focus๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž…๋ ฅํ•˜๋Š” DOM ์š”์†Œ์ธ input ํƒœ๊ทธ์— ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ inputRef ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

React์˜ useRef? Javascript์˜ ์ดˆ๊ธฐํ™”?

useRef ๋Œ€์‹  let count =0; ๋กœ ์ž‘์„ฑํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ์•ˆ ๋œ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  useRef๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

let count = 0;์„ ์ง€์—ญ์— ์ž‘์„ฑํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋งํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋œ๋‹ค.
let count = 0;์„ ์ „์—ญ์— ์ž‘์„ฑํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋งํ•˜๋ฉด useRef์™€ ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์ง€๋งŒ, ๋ ˆ์ง€์Šคํ„ฐ ์ปดํผ๋„ŒํŠธ๊ฐ€ ๋‘๊ฐœ์ผ๊ฒฝ์šฐ ๋‘๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋ณ€์ˆ˜๋“ค์„ ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์„ผ๋‹ค. useRef`๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค๊ณ  ํ•ด๋„ ๋‹ค์‹œ ๋ฆฌ์…‹๋˜์ง€ ์•Š๋Š”๋‹ค.

React Hooks

React Hooks๋ž€? ํด๋žซ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์„ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. Function์ปดํฌ๋„ŒํŠธ์—์„œ๋„ Class์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
ํŠน์ง•
์ด๋ฆ„ ์•ž์— ๋™์ผํ•œ ์ ‘๋‘์‚ฌ use๊ฐ€ ๋ถ™๋Š”๋‹ค.
์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€์—์„œ๋Š” ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ Hook๋„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

3๊ฐ€์ง€ hook ๊ด€๋ จ๋œ ํŒ

  1. ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ, ์ปค์Šคํ…€ ํ›… ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
import {useState} from "react";

const HookExam = {}> {
	const state = useState(); // ์ด๋Ÿฐ์‹์œผ๋กœ ๋‚ด๋ถ€ํ˜ธ์ถœ
    
    return <div>hookexam</div>
};
export default HookExam;
  1. ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜๋Š” ์—†๋‹ค.
if(true) {
	const~
};

๋ถˆ๊ฐ€๋Šฅ! ์„œ๋กœ ๋‹ค๋ฅธ hook ํ˜ผ๋ž€์ด ์ƒ๊ฒจ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ๋‚˜๋งŒ์˜ ์ปค์Šคํ…€ Hook๋„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.
    ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ์•ž์— use ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์จ์ฃผ๋ฉด ๋œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€