ย
2.1 useState๋?2.1.1 state2.1.2 setState2.1.3 useState2.2 useState๋ฅผ ์ฌ์ฉํ๋ ์ด์ 2.2.1 ์ผ๋ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ ๋2.2.2 State ๋ณ์๋ฅผ ์ฌ์ฉํ์ ๋2.2.3 React๊ฐ useState ์ฌ์ฉ์ ๊ถ์ฅํ๋ ์ด์ 2.3 useState ์ฌ์ฉํด๋ณด๊ธฐ2.3.1 import ํ๊ธฐ2.3.2 useState ์ ์ธํ๊ธฐ 2.3.3 state ๊ฐ์ ธ์ค๊ธฐ, ๊ฐฑ์ ํ๊ธฐ2.3.4 (์ค์ต) useState์ ์๋๋ฐฉ์ 2.4 (์ค์ต) useState ์์ฉํด๋ณด๊ธฐ2.4.1 useState์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ํผ ๋ง๋ค์ด๋ณด๊ธฐ2.4.2 ์ต์ข
์ฝ๋
ย
2.1 useState๋?
useState๋ ํจ์ํ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ณธ Hook์
๋๋ค. useState์์๋ ์ฃผ์ ํค์๋์ธ
state
์ setState
๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.ย
2.1.1 state
React์์์ state๋ ๋ฐ์ดํฐ๊ฐ ๊ด๋ฆฌ ๋ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ์ ์๋ฏธํฉ๋๋ค. React์์๋ state๊ฐ ์ด๋ป๊ฒ ์ฐ์ด๋์ง, state ์ฌ์ฉ ์์ ๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ย
// ํจ์ํ ์ปดํฌ๋ํธ function Product() { // const [state, setState] = useState(์ด๊น๊ฐ); const [price, setPrice] = useState(1000); // ํด๋์คํ ์ปดํฌ๋ํธ class Product extends React.Component { constructor(props) { super(props); this.state = { price: 1000 }; }
ย
์์ ์ฝ๋๋ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ์ฌ์ฉํ ์์์
๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ useState Hook์ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ๋ณ์ price์ ์ํ ๊ฐ์ผ๋ก 1000์ธ ์ด๊น๊ฐ์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
๋ฐ๋ฉด, ํด๋์คํ ์ปดํฌ๋ํธ๋
this.state = { price: 1000 };
์ ์ฌ์ฉํ์ฌ price๋ฅผ 1000์ผ๋ก ์ด๊ธฐํํด์ฃผ์์ต๋๋ค. ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ๋ฐ๋์ constructor(์์ฑ์) ์์์ this๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ด๊ธฐํํด์ฃผ์ด์ผ ํฉ๋๋ค. ย
state๋ JavaScript์ ๊ฐ์ฒด์ด๋ฉฐ, ์ปดํฌ๋ํธ ์์์ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ปดํฌ๋ํธ๋ ์์ ์ state๋ฅผ props๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. state๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ ์ธ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ก์ปฌ ๋๋ ์บก์ํ๋ผ๊ณ ํํ๋๊ธฐ๋ ํฉ๋๋ค.
ย
props๋ ๋ฌด์์ธ๊ฐ์?
props๋ ์์ฑ์ ๋ํ๋ด๋ ๋ฐ์ดํฐ์ด์, JavaScript์ ๊ฐ์ฒด์
๋๋ค. ์ปดํฌ๋ํธ ์์์ ๊ด๋ฆฌ๋๋ state์ ๋ค๋ฅด๊ฒ โ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋คโ๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
React ์ปดํฌ๋ํธ๋ค์ ์์ ์ props๋ฅผ ์์ฒด์ ์ผ๋ก ์์ ํด์๋ ์ ๋๋ฉฐ, ์
๋ ฅ๊ฐ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋ณํจ์์ด ๋์ผํ ์์ ํจ์์ฒ๋ผ ๋์ํด์ผ ํฉ๋๋ค.
์๋ ๋ ๋๋ง ์์๋ฅผ ํตํด props๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ย
function Introduce(props) { // --- โก return <h1>๋๋ {props.color}์์ ์ข์ํด!</h1>; } const root = ReactDOM.createRoot(document.getElementById("root")); const element = <Introduce color="์ด๋ก" />; // --- โ root.render(element);
ย
<Introduce color=โ์ด๋กโ />
element๋ก root.render()๋ฅผ ํธ์ถํฉ๋๋ค.
- props๋ก
{color: โ์ด๋กโ}
๋จ์ผ ๊ฐ์ฒด๋ฅผ Introduce ์ปดํฌ๋ํธ์ ํธ์ถ๋์ด ์ ๋ฌ๋ฐ๊ณ , ํ๋ฉด์์๋ Introduce ์ปดํฌ๋ํธ๊ฐ ๋ฐํํ ๊ฐ, ๋๋ ์ด๋ก์์ ์ข์ํด! ๊ฐ ๋ํ๋ฉ๋๋ค.
ย
์ฆ, ํด๋น ์ปดํฌ๋ํธ์ ๋จ์ผ ๊ฐ์ฒด๋ก ์ ๋ฌํ๋๋ฐ ๋ฐ๋ก ์ด โ๋จ์ผ ๊ฐ์ฒดโ๊ฐ props์
๋๋ค.
ย
2.1.2 setState
์์์ state๋ ์ปดํฌ๋ํธ ์์์ ๋ฐ์ดํฐ๊ฐ ๊ด๋ฆฌ๋๊ณ ์ ์ฅ๋๋ ๊ณต๊ฐ์์ ์์๋ณด์์ต๋๋ค. state์ ๊ฐ์ ๊ฐฑ์ ํ๊ธฐ ์ํด์ ํจ์ํ ์ปดํฌ๋ํธ์ ํด๋์คํ ์ปดํฌ๋ํธ์์๋
setState
ํจ์๋ฅผ ์ด์ฉํฉ๋๋ค. ์๋ ์ฝ๋๋ ํด๋์คํ ์ปดํฌ๋ํธ์์ setState๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋์ด๋ฉฐ, ํจ์ํ ์ปดํฌ๋ํธ์์์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ 2.3.3 ์ฑํฐ์์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
<button onClick={() => this.setState({ price: this.state.price + 100})}>๊ฐ๊ฒฉ ์ธ์โฌ๏ธ</button>
ย
์ด ์ฑ
์์ ์ค๋ช
ํ React์ ๊ธฐ๋ณธ Hook์ธ useState๋
setState
ํจ์๋ฅผ ํตํด ์ state ๊ฐ์ ๋ฐํ๋ฐ์์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ํ์ ๋ฑ๋กํ๊ณ ์ต์ state๋ก ๊ฐฑ์ ํด ์ค๋๋ค. ๋ํ props์ ๋์ผํ๊ฒ setState ํจ์๋ ๋์ผ์ฑ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ด, ๋ฆฌ๋ ๋๋ง ์์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.ย
2.1.3 useState
์์ ์์๋ค์ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ์ฌ ์ค๋ช
ํ๊ณ ์์ต๋๋ค. React Hook์ด ๋ฑ์ฅํ๊ธฐ ์ , ํจ์ ์ปดํฌ๋ํธ ์์์๋ state ์ฌ์ฉ์ด ๋ถ๊ฐํ์ผ๋ ์ด์ ๋ React ๊ธฐ๋ณธ Hook์ธ useState๋ก ํจ์ ์ปดํฌ๋ํธ ์์์๋ state๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋ useState์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ํ๋ฅผ ์ ์งํ๋ ๊ฐ์ธ state ๋ณ์์ ๊ทธ ๊ฐ์ ๊ฐฑ์ ํ๋ setState ํจ์๋ฅผ ์์ผ๋ก ๋ฐํํฉ๋๋ค.
- useState ํธ์ถ ์, ์ปดํฌ๋ํธ state๋ ์์ ํ ๋ ๋ฆฝ์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฉ๋๋ค.
- ํจ์ํ ์ปดํฌ๋ํธ์์๋ state์ ์ด๊น๊ฐ์ผ๋ก ์๋ ์ฝ๋์ ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ฐฐ์ด, ๋ฌธ์, ์ซ์ ํ์ ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ํ๋์ ์ปดํฌ๋ํธ ์์์ ์ฌ๋ฌ ๊ฐ์ useState Hook์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
function Person() { // const [state, setState] = useState(์ด๊น๊ฐ); const [age, setAge] = useState(18); const [grade, setGrade] = useState("A"); const [todos, setTodos] = useState([{ subject: "Math" }]); const [check, setCheck] = useState(false); ... }
ย
2.2 useState๋ฅผ ์ฌ์ฉํ๋ ์ด์
React์์ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ผ๋ฐ ๋ณ์๊ฐ ์๋ state ๋ณ์๋ฅผ ํ์ฉํ๋ ์ด์ ๋ DOM ๋ ๋๋ง๊ณผ ๋ฐ์ ํ ์ฐ๊ด์ด ์์ต๋๋ค. ์ด๋ค ์ด์ ๋ก state ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง, ๊ทธ์ค์์๋ ์ useState๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ์์ ๋ฅผ ํตํด ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ย
2.2.1 ์ผ๋ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ ๋
์๋ ์์ ๋ ๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค ์ค๋ ๋ง์ ๋ฌผ์ด ๋ช ์์ธ์ง ๊ธฐ๋กํ ์ ์์ต๋๋ค. ๋ฒํผ์ ํด๋ฆญ ํ์์ ๋ฐ๋ผ ๋ณํ๋ ์ํ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ์ผ๋ฐ ๋ณ์์ธ
drink
๋ฅผ 0์ผ๋ก ์ด๊ธฐํํด์ค๋๋ค. ๋ฒํผ์ ํด๋ฆญํ์ฌ drinkWater
ํจ์๋ฅผ ํธ์ถํ๋ฉด drink
๋ณ์์ ํด๋ฆญ ํ์๊ฐ ๋์ ๋์ด โต์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด ์ค๋๋ค.ย
// ํจ์ํ์ผ๋ก ์ฌ์ฉํ ๋ function App() { let drink = 0; // ์ผ๋ฐ ๋ณ์ ์ฌ์ฉ const drinkWater = () => { drink += 1; console.log(`๋ฒํผ ํด๋ฆญํ์: ${drink}๋ฒ`); }; return ( <> <p> ๐ฅค ์ค๋์ ๋ฌผ <strong> {drink}</strong>์์ ๋ง์ จ์ด์! // --- โต </p> <button onClick={drinkWater}>๐ง</button> </> ); } export default App;
ย
ย
drink
์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํ๋ฉด์์๋ ๋์ผํ๊ฒ ๋ณ๊ฒฝ๋ ๊ฐ์ด ์
๋ฐ์ดํธ๋๋ ๊ฒฐ๊ณผ๋ฅผ ์์ํ์ ๊ฒ๋๋ค. ํ์ง๋ง ์ฝ์์์ ํ์ธํ ์ ์๋ฏ์ด drink
์ ๊ฐ์ ๋ณํ๊ณ ์์ง๋ง ์ค์ ํ๋ฉด์๋ ๋ณ๊ฒฝ๋ ๊ฐ์ด ๋ ๋๋ง ๋์ง ์๊ณ ์์ต๋๋ค.ย
์ด์ ๋ ์ปดํฌ๋ํธ๊ฐ DOM์์ ๋ ๋๋ง ๋ ๋ ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์์ต๋๋ค. ํจ์ ์ปดํฌ๋ํธ ์์์ ์ผ๋ฐ ๋ณ์๋ ๋ ๋๋ง ๋ ๋๋ง๋ค ์ด๊ธฐํ ๋์ง๋ง, state ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ฐ์ํ์ฌ ์
๋ฐ์ดํธํด ์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค.
ย
2.2.2 State ๋ณ์๋ฅผ ์ฌ์ฉํ์ ๋
์ด์ useState๋ฅผ ์ฌ์ฉํ์ฌ
drink
์ ์ํ๋ฅผ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค. useState๋ฅผ ์ ์ธํด ์ฃผ๊ณ , setDrink
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.ย
import { useState } from "react"; function App() { const [drink, setDrink] = useState(0); // useState ์ฌ์ฉ const drinkWater = () => { setDrink(drink + 1); }; return ( <> <p> ๐ฅค ์ค๋์ ๋ฌผ <strong> {drink}</strong>์์ ๋ง์ จ์ด์! </p> <button onClick={drinkWater}> ๐ง </button> {console.log(`๋ฒํผ ํด๋ฆญํ์: ${drink}๋ฒ`)} </> ); } export default App;
ย
ย
์ผ๋ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ ๋์ ๋ค๋ฅด๊ฒ
setDrink
ํจ์๋ก ์ํ ๊ฐ์ ๊ฐฑ์ ํด ์คฌ๊ธฐ ๋๋ฌธ์ drink
์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง ๋์ด ์ต์ ๊ฐ์ด ๋ฐ์๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.ย
2.2.3 React๊ฐ useState ์ฌ์ฉ์ ๊ถ์ฅํ๋ ์ด์
ํจ์ ์ปดํฌ๋ํธ๋ state ๋ณ๊ฒฝ์ผ๋ก ๋ฆฌ๋ ๋๋ง์ด ๋๋ฉด ์ปดํฌ๋ํธ ๋ด๋ถ์ ์๋ ๋ณ์๋ค์ด ๋ชจ๋ ์ด๊ธฐํ๋ฉ๋๋ค. ๊ธฐ์กด์ ์ปดํฌ๋ํธ๊ฐ ์๋ก๊ณ ์นจ ๋๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ state์ ์ต์ ์ํ๋ฅผ ์๋ก์ด ์ปดํฌ๋ํธ๋ก ๊ฐฑ์ ํด ์ฃผ๋ ๊ฒ์ ๋ ๊ฐ๊น๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
ย
useState๋ ์ํ ์ฃผ๊ธฐ ๋ฉ์๋์ state๋ฅผ ํจ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ๊ณ , ํจ์์ ํน์ฑ์ ํ์ฉํ์ฌ ํ์ฌ ์ํ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ state ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝ์์ผ์ฃผ๋ setState ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ฐํํด ์ค๋๋ค.
ย
const [state, setState] = useState(์ด๊น๊ฐ);
ย
์ด๋ ๊ธฐ์กด์ state๋ฅผ ๋ณต์ฌํ์ฌ ์๋กญ๊ฒ state๋ฅผ ๊ฐฑ์ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ ์งํฌ ์ ์๊ณ , ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ค์ ๋ฏธ๋ฆฌ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ํ, setState๋ฅผ ํตํด state์ ๋ณํ๊ฐ ์๊ธฐ๋ฉด ์์์ ๋ฆฌ๋ ๋๋ง์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ย
setState ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
์์ state๋ ๊ฐ์ฒด๋ผ๊ณ ํ์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ state ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด ์ฃผ์ํด์ผ ํ ์ ์ด ์์ต๋๋ค. state๋ฅผ ์ง์ ๋ณ๊ฒฝํ๊ฒ ๋๋ ๊ฒฝ์ฐ, ์๋ก์ด ๊ฐ๊ณผ ์ด์ ๊ฐ์ด ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ๊ฐ์์ง๋ฉด์ ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ์ด ๊นจ์ง๊ฒ ๋๊ณ , React ๋ํ ์ฐธ์กฐ ๊ฐ์ด ๊ฐ์ ๋ณํ๊ฐ ์๋ค๊ณ ํ๋จํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํด์ฃผ์ง ์์ต๋๋ค. React๋ state์ ๋ณํ๊ฐ ์๋ค๋ ๊ฒ์ state ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ(์ฃผ์๊ฐ)๋ง ๋น๊ตํ์ฌ ํ๋จํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ React์์๋ ๋ณ๊ฒฝ๋ state ๊ฐ์ ๋ฐ๋ก ๋ฐ์ํด ์ฃผ๊ฑฐ๋ ์ด์ state ๊ฐ์ ์ฌ์ฉํ์ฌ state๋ฅผ ๋ฐ๋ก ๋ณ๊ฒฝํด ์ฃผ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๊ฐ์ฒด ๋์ ํจ์๋ฅผ ๊ฐ์ผ๋ก ์ ๋ฌํ์ฌ state ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๊ถ์ฅํฉ๋๋ค.
ย
์ด์ ๋ถํฐ ์ค์ต์ ํตํด useState์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์๋ ์๋ฆฌ๋ฅผ ํ์ธํด ๋ด
์๋ค.
ย
2.3 useState ์ฌ์ฉํด๋ณด๊ธฐ
useState๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ๊ฒฝ์ค์ ์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. React ์ค์น๋ ํฐ๋ฏธ๋ ์ฐฝ์์ ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅํฉ๋๋ค.
npx create-react-app my-app . // npx create-react-app my-app --template basic-react // ์ต์ํ์ ํ์ํ ํ์ผ๋ง ์ค์น๋ฉ๋๋ค.
ย
2.3.1 import ํ๊ธฐ
useState
๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ react ๋ชจ๋์์ useState๋ฅผ ๋ถ๋ฌ์์ผ ํฉ๋๋ค.import { useState } from 'react';
ย
useState๋ฅผ ์ ํํ ์ด๋์ ๋ถ๋ฌ์ค๋ ๊ฑด๊ฐ์?
React๋ฅผ ์ค์นํ๋ฉด ์์ฑ๋๋ ํด๋๋ค ์ค์๋
node_module
์ด๋ผ๋ ํด๋๊ฐ ์๋๋ฐ, ๊ทธ ์์ ์๋ react ๋ชจ๋ ํด๋๋ฅผ ์ ๋ค์ฌ๋ค๋ณด๋ฉด ๋ค์ํ Hooks ํจ์๋ค์ด ์ ์ธ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์์ Hook์ ๋ถ๋ฌ์ ์ฌ์ฉํฉ๋๋ค.
ย
2.3.2 useState ์ ์ธํ๊ธฐ
const [state, setState] = useState(์ด๊น๊ฐ);
ย
useState ํจ์์ ์ด๊น๊ฐ์ ๋ฃ์ด ํธ์ถํ๋ฉด ๋ ๊ฐ์ง ๊ฐ์ด ๋ฐํ๋๋๋ฐ, ์ด๋ ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฌธ๋ฒ์ ์ด์ฉํ์ฌ ๊ฐ๊ฐ state์ setState๋ผ๋ ๋ณ์์ ํจ์๋ก ํ ๋น๋ฉ๋๋ค. ์ธ์๋ก ๋๊ธด ์ด๊น๊ฐ์ state ๋ณ์๋ฅผ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
ย
ํ์ฌ ์ํ ๊ฐ์ state ๋ณ์์ ์ ์ฅ๋๊ณ , state ๋ณ์ ์์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๊ณ ์ถ๋ค๋ฉด setState ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ state๋ผ๋ ๋ณ์ ๋ช
์ count, email ๋ฑ์ผ๋ก ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ย
๋ค์ ์ฝ๋๋ count๋ผ๋ ๋ณ์๋ 0์ผ๋ก ์ด๊ธฐํ๋์ด์๊ณ , setCount ํจ์๋ count ๊ฐ์ ๋ณ๊ฒฝ์ํฌ ์ ์๋ ํจ์์์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
ย
const [count, setCount] = useState(0);
ย
2.3.3 state ๊ฐ์ ธ์ค๊ธฐ, ๊ฐฑ์ ํ๊ธฐ
์์์ ์์ฑํ ๋ณ์ count๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํด ๋ด
์๋ค.
ย
<p>You clicked {count} times</p>
ย
๊ทธ๋ผ ์ด count ๊ฐ์ ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ ์์๊น์? ์์์ ์ค๋ช
ํ ๋ฐ์ ๊ฐ์ด count ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด
setCount
๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ย
<button onClick={() => setCount(count + 1)}> Click me </button>
ย
๋ฒํผ์ ํด๋ฆญํ๋ฉด onClick ์ด๋ฒคํธ๋ก ์ธํด setCount ํจ์๋ฅผ ํธ์ถํ๊ณ , count ๋ณ์์ 1์ ๋ํด ๊ฐ์ ๊ฐฑ์ ํฉ๋๋ค. count ๋ณ์๋ ํด๋ฆญ๋ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐ๋ ๊ฐ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
ย
2.3.4 (์ค์ต) useState์ ์๋๋ฐฉ์
๊ทธ๋ ๋ค๋ฉด useState๋ฅผ ์คํํ์ ๋ ๊ฐ์ ์ด๋ป๊ฒ ๊ฐฑ์ ๋๋ ๊ฑธ๊น์? ์ด ๊ณผ์ ์ ๋ค์ ์์ ๋ฅผ ํตํด ์์๋ด
์๋ค.
ย
import { useState } from "react"; import "./app.css"; function App() { const [count, setCount] = useState(0); console.log("๋ ๋๋ง ๋์์ต๋๋ค."); console.log(`ํ์ฌ count : ${count}`); return ( <div> <img src="./๋ผ์ด์บฃ.png" alt="๋ผ์ด์บฃ"></img> <p>๋ผ์ด์บฃ์ด ๊ท์ฌ์ฐ์๋ค๋ฉด ๋ฐ๋ด์ ๋๋ฌ์ฃผ์ธ์!</p> <button onClick={() => { console.log("-----------"); console.log("๐ ๋ฒํผ์ ํด๋ฆญํ์ต๋๋ค."); setCount(count + 1); console.log(`๋ ๋๋ง ๋๊ธฐ ์ ์ count : ${count}`); }} > ๐ </button> <span>{count}</span> </div> ); } export default App;
ย
๋ฒํผ์ ํด๋ฆญํ ๋๋ง๋ค ํ๋ฉด์ด ๋ฆฌ๋ ๋๋ง ๋๋ฉด์ count ํ์๊ฐ ์ฆ๊ฐํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฝ์์ฐฝ์ ํตํด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๊ณ count ๋ณ์์ ๊ฐ์ด ๊ฐฑ์ ๋๋ ๊ณผ์ ์ ํ์ธํด ๋ด
์๋ค.
ย
React Developer Tools ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํ๋ฉด ๋ ๋๋ง์ด ๋๋ ๊ตฌ๊ฐ์ ํ์ํด์ฃผ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ย
- ์ฒ์ ์๋ฒ๋ฅผ ์คํํ์ ๋, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ณ ์ด๊น๊ฐ์ด ๋ด๊ธด count๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ์ดํ,
๐ย ๋ฒํผ
์ ํด๋ฆญํ๋ฉด ๋ฐ๋ก setCount ํจ์๊ฐ ํธ์ถ๋๊ณ ํ์ฌ ์์ ์ count๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- ๋ ๋๋ง์ด ๋ ํ, ํ์ฌ ์์ ์ count ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
ย
ํน์ ์ฝ์์ฐฝ์์ ์กฐ๊ธ ์์ํ ๋ถ๋ถ์ด ๋ณด์ด์์ง ์๋์?
ย
๐ย ๋ฒํผ
์ ํด๋ฆญํ๋ฉด setCount ํจ์๊ฐ ํธ์ถ๋์ด ๋ฐ๋ก count ๊ฐ ๊ฐฑ์ ๋ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก๋ ๋ฒํผ์ ํด๋ฆญํ ์ดํ์๋ count ๊ฐ์ ๊ทธ๋๋ก์
๋๋ค. ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ ๋ ํ์์ผ count ๊ฐ ๊ฐฑ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ์, ์ ์ด๋ฌํ ํ์์ด ์ผ์ด๋๋ ๊ฑธ๊น์?ย
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉฐ ์
๋ฐ์ดํธ ๊ณผ์ ์ ์์๋๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ย
- setCount ํจ์๊ฐ ํธ์ถ๋๋ฉด ๊ฐฑ์ ํ ๊ฐ์ react ๋ชจ๋ ๋ด ์ ์ธ๋ ์ ์ญ ๋ณ์์ ํ ๋นํด ์ค๋๋ค.
- ์ดํ, ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๊ณ App.js๊ฐ ๋ค์ ์คํ๋ฉ๋๋ค. ๊ทธ๋ผ ์ด๊น๊ฐ 0์ ๋ค์ useState์๊ฒ ์ ๋ฌํ๋ฉด์ useState ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ํธ์ถ๋ useState ํจ์๋ ๋จผ์ react ๋ชจ๋ ๋ด ์ ์ธ๋ ์ ์ญ ๋ณ์์ ๊ฐ์ด ์๋์ง ํ์ธํฉ๋๋ค. ๊ฐ์ด ์๋ค๋ฉด ์ด๊น๊ฐ 0์ ๋ฌด์๋๊ณ ์ ์ญ ๋ณ์์ ์ ์ฅํด๋์๋ ๊ฐ๊ณผ setCount ํจ์๋ฅผ ๋ฐํํฉ๋๋ค.
- ์์์ useState๋ [๋ณ์, ํจ์] ์ด๋ ๊ฒ ๋ ๊ฐ์ง ๊ฐ์ ๋ฐํํ๋ค๊ณ ํ์์ฃ ? ๋ฐํ๋ฐ์ ๋ ๊ฐ์ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ํตํด ๊ฐ๊ฐ count ๋ณ์์ setCount ํจ์์ ํ ๋น๋ฉ๋๋ค.
ย
์ ๋ฆฌํ์๋ฉด, setCount ํจ์๋ ํ์ฌ์ state ๋ณ์๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์์ต๋๋ค. ๋์ ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ ๋ ์ดํ์ useState๊ฐ ๋ฐํํ ๊ฐ์ ๋ณ๊ฒฝํด ์ฃผ๊ณ , ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ์์ผ์ฃผ๋ ์ญํ ์ ํ๊ฒ ๋ฉ๋๋ค.
useState์ ์๋ ๋ฐฉ์์ ์ง์ ํ์ธํด ๋ณด๊ณ ์ถ๋ค๋ฉด?
node_module > react > imd > react.development.js ํ์ผ์ ๋ค์ด๊ฐ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
ย
- useState๋ ์ด๊น๊ฐ์ ์ธ์๋ก ๋ฐ๋ ํจ์์ ๋๋ค. ์ด ํจ์์๋ resolveDispatcher ํจ์๋ฅผ ํตํด ๋ฆฌํด๋ dispatcher์ useState ๋ฉ์๋์ ์ด๊น๊ฐ์ ์ ๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ์์ต๋๋ค.
ย
- ๊ฐ์ ํ์ผ ๋ด์์ resolveDispatcher ํจ์๋ฅผ ์ฐพ์๋ณด๋ฉด resolveDispatcher ํจ์๋ ๋๋ค์ ReactCurrentDispatcher ์์ ์๋ current๋ผ๋ ๊ฐ์ ๋ฐํํ๊ณ ์์ต๋๋ค.
ย
- ๋ง์ง๋ง์ผ๋ก ReactCurrentDispatcher๋ฅผ ๊ฐ์ ํ์ผ ๋ด์์ ๋ ํ๊ณ ๋ค์ด๊ฐ๋ณด๋ฉด, ์ ์ญ์ผ๋ก ์ ์ธ๋ current๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ณ์๋ผ๊ณ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ย
ย
2.4 (์ค์ต) useState ์์ฉํด๋ณด๊ธฐ
ย
2.4.1 useState์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ํผ ๋ง๋ค์ด๋ณด๊ธฐ
์ด์ useState ์ฌ์ฉํด๋ณด๊ธฐ ์์ ์์๋ ๋ฒํผ์ ๋๋ฅด๋ฉด count ๊ฐ์๊ฐ ์ฆ๊ฐํ๋ ๊ฐ๋จํ ์์ ์ค์ต์ ํตํด useState์ ์๋ ๋ฐฉ์์ ๋ํด ์์๋ณด์์ต๋๋ค. ์ด๋ฒ์๋ ์์์ ๋ฐฐ์ด ๊ฐ๋
์ ํ์ฅํ์ฌ useState์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ ๋ก๊ทธ์ธ ํผ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
ย
- ๋จผ์ React ๊ธฐ๋ณธ Hook์์ ์ ๊ณตํ๋ย useState ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ React์์ useState๋ฅผ import ๋ฐ์์์ผ ํฉ๋๋ค. ๋ชจ๋ ์ฝ๋๋ App.js์์ ์งํํ๊ฒ ์ต๋๋ค.
import { useState } from "react";
ย
- LoginForm ํจ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , ๊ทธ ์์ state ๋ณ์๋ฅผ ์ ์ธํด ์ค๋๋ค.
import { useState } from "react"; // ํจ์ ์ปดํฌ๋ํธ ์์์๋ Hook์ ์ด์ฉํ์ฌ state๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. function LoginForm() { const [id, setId] = useState(""); const [password, setPassword] = useState(""); return; } function App() { return ( <div> <LoginForm /> </div> ); } export default App;
id ์ password ๋ผ๋ state ๋ณ์๋ฅผ ์ ์ธํด ์ฃผ์์ต๋๋ค. id ์ password์ ์ด๊น๊ฐ์ ์ฒ์์ id ์ password์ input ์ ๋น์นธ์ผ๋ก ์์ํ๊ธฐ ์ํด ๋น ๋ฌธ์์ด๋ก ์ด๊ธฐํํด์ฃผ์์ต๋๋ค. ๋ณ์์ ์ด๊น๊ฐ์ useState Hook์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ฉด id ์ setId ๋ ๊ฐ์ง ๊ฐ์ ๋ฐฐ์ด ํํ๋ก ๋ฐํํฉ๋๋ค.
์ด์ id ์ password๋ผ๋ state๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ํด๋น state ๊ฐ์ ๊ฐฑ์ ํ ์ ์๋ setId ์ setPassword ํจ์๋ฅผ ํตํด state๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ย
state ์ฌ์ฉ ์ ์ฃผ์ํ ์
state๋ ๊ฐ์ ๋ณ๊ฒฝํ ๋ state ๋ณ์์ ์ง์ ์ ๊ทผํด์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋, ํด๋น ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ setState ํจ์๋ฅผ ์ด์ฉํด์ state ๊ฐ์ ๋ฐ๊ฟ์ฃผ์ด์ผ ํฉ๋๋ค.
setState ํจ์๋ฅผ ์ด์ฉํด์ state ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋ฉด์ ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
ย
- state ๋ณ์๋ฅผ ์ ์ธํด ์ฃผ์์ผ๋, ์ด์ ๋ก๊ทธ์ธ ํผ์ ํธ๋ค๋ง ํ๋ ํจ์๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
// login form์ ํธ๋ค๋ง ํ๋ ํจ์ const handleLoginForm = (event) => { event.preventDefault(); };
handleLoginForm ํจ์ ์์๋ preventDefault() ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ form ์์ submit ์ญํ ์ ํ๋ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ ์ ๋ ์ฐฝ์ด ์๋ก๊ณ ์นจ ๋์ง ์๋๋ก ํ์์ต๋๋ค.
ย
Event.preventDefault() ๋ ๋ฌด์์ผ๊น์?
Event ์ธํฐํ์ด์ค์ย preventDefault()ย ๋ฉ์๋๋ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌํ์ง ์์ ๊ฒฝ์ฐ, ํด๋น ์ด๋ฒคํธ์ ๋ํย ์ฌ์ฉ์ ์์ด์ ํธ์ ๊ธฐ๋ณธ ๋์์ ์คํํ์ง ์๋๋ก ์ง์ ํฉ๋๋ค.
ย
- id ์ password๋ฅผ ์ ๋ ฅํ ๋ ๊ฐ์ input๊ณผ form์ ์ ์ถํ ์ ์๋ ๋ก๊ทธ์ธ ๋ฒํผ์ผ๋ก ๊ตฌ์ฑ๋๋๋ก ๋งํฌ์ ์ ์์ฑํ์์ต๋๋ค.
... return ( <form onSubmit={handleLoginForm}> <label> Id : <input type='text' value={id} placeholder='์์ด๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.'/> </label> <label> Password : <input type='password' value={password} placeholder='๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.'/> </label> <button type='submit'>Login</button> </form> );
ย
๊ทธ๋ผ ํ๋ฉด์์ ๋ก๊ทธ์ธ ํผ์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ํ๋ฒ ํ์ธํด ๋ณผ๊น์?
ย
ย
์ค์ ํ๋ฉด์์๋ ์์ ๊ฐ์ด ๊ฐ๋จํ ๋ก๊ทธ์ธ ํผ์ ํ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฝ๋๋ ์์ง ์์ฑ๋์ง ์์ ์ฝ๋์
๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํ์ธํด ๋ณด๋ฉด ๊ทธ ์ด์ ๋ฅผ ์น์ ํ๊ฒ ์๋ ค์ฃผ๊ณ ์์ต๋๋ค.
ย
ย
์์์ ์์ฑํ ์ฝ๋๋ก id ์ password์ ์ํ๋ ๋ฐ๊ฟ ์ ์์ง๋ง, ์์ง input์ ๊ฐ์ ์
๋ ฅํ ์๋ ์์ต๋๋ค. id ์ password์ state๋ง ์ ์ธํด ์ฃผ์์ ๋ฟ, ์ด๋ค ๋์์ ํ๋ผ๊ณ ์ง์ํ์ง ์์๊ธฐ ๋๋ฌธ์ state ๊ฐ์ ๋ณ๊ฒฝ ์์ผ์ฃผ๊ธฐ ์ํ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด ์ฃผ์ด์ผ ํฉ๋๋ค.
์ฆ, input์ ์
๋ ฅํ ๊ฐ์ React๊ฐ ์ธ์งํ๊ณ ๋์ํ ์ ์๋๋ก onChange๋ผ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ์ state ๊ฐ์ ๋ณ๊ฒฝ์์ผ์ค์ผ value ๊ฐ๋ ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก form ํ๊ทธ๋ฟ ์๋๋ผ, id ์ password์ ๊ฐ input ํ๊ทธ์๋ onChange๋ผ๋ ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ ์ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ํ์ํฉ๋๋ค.
ย
- id ์ password์ ๊ฐ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ์์ต๋๋ค.
// id input์ ํธ๋ค๋ง ํ๋ ํจ์ const handleIdInput = (event) => { setId(event.target.value); }; // password input์ ํธ๋ค๋ง ํ๋ ํจ์ const handlePasswordInput = (event) => { setPassword(event.target.value); };
ย
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ์์ผ๋, ๊ฐ input์ onChange ์ด๋ฒคํธ๋ ๋ฑ๋กํด ์ค๋๋ค.
... return ( <form onSubmit={handleLoginForm}> <label> Id : <input type='text' value={id} placeholder='์์ด๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.' onChange={handleIdInput} /> </label> <label> Password : <input type='password' value={password} placeholder='๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.' onChange={handlePasswordInput} /> </label> <button type='submit'>Login</button> </form> );
ย
- ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ค๋ฉด, ์ด์ ๋ณ๊ฒฝ๋ ๊ฐ์ด ์ ๋ค์ด์ค๋์ง ํ์ธํ๊ธฐ ์ํด ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ ์ฝ๋๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
// login form์ ํธ๋ค๋ง ํ๋ ํจ์ const handleLoginForm = (event) => { event.preventDefault(); console.log("๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ์ต๋๋ค."); alert(` Id : ${id} \n Password : ${password}`); }; // id input์ ํธ๋ค๋ง ํ๋ ํจ์ const handleIdInput = (event) => { console.log("์์ด๋๋ฅผ ์ ๋ ฅํฉ๋๋ค."); // console.log(event.target.value)๋ฅผ ๋ฃ์ด์ ๊ฐ์ ํ์ธํด๋ณด์ธ์. setId(event.target.value); }; // password input์ ํธ๋ค๋ง ํ๋ ํจ์ const handlePasswordInput = (event) => { console.log("ํจ์ค์๋๋ฅผ ์ ๋ ฅํฉ๋๋ค."); setPassword(event.target.value); };
ย
์ด๋ฒคํธ ํ์ธํด๋ณด๊ธฐ
console.log(event) : ํด๋น ์ด๋ฒคํธ์ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
console.log(event.target) : ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
console.log(event.target.value) : ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์ ์
๋ ฅ๋ ๊ฐ์ ํ์ธํฉ๋๋ค.
ย
- ์ด์ ๋ก๊ทธ์ธ ํผ์ด ์์ฑ๋์์ผ๋ ์ฝ๋๋ฅผ ์คํ์์ผ ๋ณด๊ฒ ์ต๋๋ค.
id ์ password์ input์ ๊ฐ์ ์
๋ ฅํ ํ์ Login ๋ฒํผ์ ํด๋ฆญํด๋ณด๋ฉด ์ฝ์์ฐฝ์์๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๊ฒ ๋ ๊น์?
ย
ย
ย
๊ฐ input์ ๊ฐ์ ์
๋ ฅํ ๋๋ง๋ค ์์ ๊ฐ์ด ์ฝ์์ฐฝ์ ๋ฉ์์ง๊ฐ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Login ๋ฒํผ์ ํด๋ฆญํ๋ฉด โ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ์ต๋๋ค.โ๋ผ๋ ๋ฉ์์ง์ ํจ๊ป ์๋์ ๊ฐ์ alert ์ฐฝ์ด ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, alert ์ฐฝ์์๋ ๊ฐ input์ ์
๋ ฅํ ํ
์คํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ย
ย
ย
์ด๋ ๊ฒ useState๋ฅผ ์ฌ์ฉํ์ฌ state ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ก๊ทธ์ธ ํผ์ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
useState๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ input์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง ํด์ฃผ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. ๋งค๋ฒ ๋ชจ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ์
๋ฐ์ดํธ ํ๋ฉด ๋ง์ ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ React Hook์์ ์ ๊ณตํ๋ useState๋ฅผ ํตํด ํน์ ์ํ(state)๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํด๋น ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ค์ ๋ ๋๋ง ํด์ฃผ๋ ๊ฒ์
๋๋ค.
ย
ย
2.4.2 ์ต์ข ์ฝ๋
import { useState } from "react"; function LoginForm() { const [id, setId] = useState(""); const [password, setPassword] = useState(""); const handleLoginForm = (event) => { event.preventDefault(); console.log("๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ์ต๋๋ค."); alert(` Id : ${id} \n password : ${password}`); }; const handleIdInput = (event) => { console.log("์์ด๋๋ฅผ ์ ๋ ฅํฉ๋๋ค."); setId(event.target.value); }; const handlePasswordInput = (event) => { console.log("ํจ์ค์๋๋ฅผ ์ ๋ ฅํฉ๋๋ค."); setPassword(event.target.value); }; return ( <form onSubmit={handleLoginForm}> <label> Email : <input type='text' value={id} placeholder='์์ด๋๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.' onChange={handleIdInput} /> </label> <label> Password : <input type='password' value={password} placeholder='๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์.' onChange={handlePasswordInput} /> </label> <button type='submit'>Login</button> </form> ); } function App() { return ( <div> <LoginForm /> </div> ); } export default App;
ย
ย