-
[React] State & Props & ๋ ๋๋ง ์ ์codeStates front-end/React 2023. 1. 25. 23:11๋ฐ์ํ
๐๋ฆฌ์กํธ ๊ฐ๋
๐State & Props
State : ์ด๋ฉด์ ๋ณํ ์ ์๋ ๊ฐ(์ํ)
์ปดํฌ๋ํธ์ ์ฌ์ฉ ์ค ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ
Props : ์ฑ๋ณ์ด๋ ์ด๋ฆ์ฒ๋ผ ๋ณํ์ง ์๋ ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
ex) ์ด๋ค๊ฒ์ด Props ๋๋ State์ ์ ํฉํ ๊น?
- ์ด๋ฆ
- ์ฑ๋ณ
- ๋์ด
- ํ์ฌ ์ฌ๋ ๊ณณ
- ์ทจ์ ์ฌ๋ถ
- ๊ฒฐํผ/์ฐ์ ์ฌ๋ถ
์ ๋ต : Props - ์ด๋ฆ, ์ฑ๋ณ State - ์ฑ๋ณ, ๋์ด, ์ด๋ฆ, ํ์ฌ ์ฌ๋ ๊ณณ, ์ทจ์ ์ฌ๋ถ, ๊ฒฐํผ/์ฐ์ ์ฌ๋ถ
props์ ํน์ง
์ปดํฌ๋ํธ ์์ฑ(property)
์น์ดํ๋ฆฌ์ผ์ด์ ์์ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง ์์ฑ์ ํด๋น
๋ถ๋ชจ ์ปดํฌ๋ํธ(์์ ์ปดํฌ๋ํธ)๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ
๊ฐ์ฒด ํํ
์ฝ๊ธฐ ์ ์ฉ์ด๋ค
-> ํจ๋ถ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ ๊ฐ์ฒด
๐ก๋ ๋๋ง์ด ๋ฌด์์ธ๊ฐ์? ์๋ฒ๋ก๋ถํฐ HTML ํ์ผ์ ๋ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ฟ๋ ค์ฃผ๋ ๊ณผ์
- HTML์ ํ์ฑํ์ฌ DOM ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- CSS๋ฅผ ํ์ฑํ์ฌ CSSOM ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- DOM ๊ณผ CSSOM ์ ๊ฒฐํฉํ์ฌ ๋ ๋๋ง ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ๋ ๋๋ง ํธ๋ฆฌ์์ ๊ฐ ๋ ธ๋์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
- ๊ฐ๋ณ ๋ ธ๋๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค.
How to use props1
- ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ(data)๊ณผ ์์ฑ์ ์ ์ํ๋ค.
- props๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌํ๋ค.
- ์ ๋ฌ๋ฐ์ props๋ฅผ ๋ ๋๋งํ๋ค.
์์ ์ปดํฌ๋ํธ(Parent) / ํ์ ์ปดํฌ๋ํธ(child)
function Parent() { return ( <div className="parent"> <h1>I'm the parent</h1> <Child /> </div> ); }; function Child() { return ( <div className="child"></div> ); };
์ ๋ฌํ๊ณ ์ํ๋ ์์ฑ์ ์ ์
function Parent() { return ( <div className="parent"> <h1>I'm the parent</h1> <a href="www.codestates.com">Click me to visit Code States</a> <Child attribute={value} /> // React์์ JSX ์์ฑ ๋ฐ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ 1 <Child text={"I'm the eldest child"} /> // React์์ JSX ์์ฑ ๋ฐ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ 2 </div> ); };
์ ๋ฌ๋ ์ปดํฌ๋ํธ ๋ฐ๊ธฐ
function Child(props) { // ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ๋ฏ react ์ปดํฌ๋ํธ์ props๋ฅผ ์ ๋ฌ return ( <div className="child"></div> // ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ด ); };
props ๋ ๋๋ง
function Child(props) { return ( <div className="child"> <p>{props.text}</p> // { attribute : value }์ ํํ๋ฅผ dot notation์ผ๋ก ์ ๊ทผ </div> ); };
์คํ ๊ฒฐ๊ณผ
import "./styles.css"; function Parent() { return ( <div className="parent"> <h1>I'm the parent</h1> <Child text={"I'm the eldest child"} /> {/* Child ์ปดํฌ๋ํธ์ ๋ ๋ค๋ฅธ ๋ฌธ์์ด์ props ๋ก ์ ๋ฌํด ๋ณด์ธ์ */} <Child /> </div> ); } function Child(props) { // console ์ ์ด์ด props ์ ํํ๋ฅผ ์ง์ ํ์ธํ์ธ์. console.log("props : ", props); return ( <div className="child"> <p>{props.text}</p> </div> ); } export default Parent;
props ์ ๋ฌ๋ ๊ฒ์ด ํ์ธ๊ฐ๋ฅํ๋ค
How to use props2
props๋ฅผ ์ ๋ฌํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ์ ์ฌ์ด์ value๋ฅผ ๋ฃ์ด ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
function Parent() { return ( <div className="parent"> <h1>I'm the parent</h1> <Child>I'm the eldest child</Child> </div> ); }; function Child(props) { return ( <div className="child"> <p>{props.children}</p> </div> ); };
๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์ค์ต
App ์ปดํฌ๋ํธ์ ์๋ itemOne๊ณผ itemTwo๋ฅผ Learn ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ์ฌ, "React๋ฅผ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค"
๋ผ๋ ๋ฌธ์์ด์ด rendering ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
import "./styles.css"; const App = () => { const itemOne = "React๋ฅผ"; const itemTwo = "๋ฐฐ์ฐ๊ณ ์์ต๋๋ค."; return ( <div className="App"> {/* Learn ์ปดํฌ๋ํธ์ itemOne ๊ณผ itemTwo ๋ฅผ props ๋ก ์ ๋ฌํ์ธ์ */} <Learn>{itemOne} </Learn> <Learn text = {itemTwo} /> </div> ); }; const Learn = (props) => { // ์ ๋ฌ๋ฐ์ props ๋ฅผ ์๋ <div> tag ์ฌ์ด์ ์ฌ์ฉํ์ฌ // "React๋ฅผ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค" ๋ผ๋ ๋ฌธ์ฅ์ด ๋ ๋๋ง๋๋๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ธ์ return <div className="Learn"> {props.children}{props.text} </div>; }; export default App;
์คํ ๊ฒฐ๊ณผ
๐ ์ ํ๋ฆฌ์ผ์ด์ ์ "์ํ"
์ปดํฌ๋ํธ ๋ด์์ ๋ณํ ์ ์๋ ๊ฐ, ์ฆ ์ํ๋ React state๋ก ๋ค๋ค์ผ ํ๋ค
import React, { useState } from "react"; import "./styles.css"; function CheckboxExample() { const [isChecked, setIsChecked] = useState(false); const handleChecked = (event) => { setIsChecked(event.target.checked); }; return ( <div className="App"> <input type="checkbox" checked={isChecked} onChange={handleChecked} /> <span>{isChecked ? "Checked!!" : "Unchecked"}</span> </div> ); } export default CheckboxExample;
State hook, useState
useState ์ฌ์ฉ๋ฒ
React ์์๋ state ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก useState ๋ผ๋ ํน๋ณํ ํจ์๋ฅผ ์ ๊ณต
useState๋ฅผ ํธ์ถํ๋ฉด ๋ฐฐ์ด์ ๋ฐํ
๋ฐฐ์ด 0๋ฒ์งธ -> ํ์ฌ state ๋ณ์, ๋ฐฐ์ด 1๋ฒ์งธ -> ์ด ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์
useState์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฐ -> state์ ์ด๊น๊ฐ
const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(์ํ ์ด๊ธฐ ๊ฐ);
- isChecked : state๋ฅผ ์ ์ฅํ๋ ๋ณ์
- setIsChecked : state isChecked ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
- useState : state hook
- false : state ์ด๊น๊ฐ
import { useState } from "react"; //useState ํจ์ react์์ ๋ถ๋ฌ์ค๊ธฐ function CheckboxExample() { // 1๋ฒ ์ฝ๋๋ฅผ ํ์ด์ฐ๋ฉด const [isChecked, setIsChecked] = useState(false); // 1๋ฒ //... // 2๋ฒ ์ฝ๋์ ๊ฐ์ต๋๋ค. const stateHookArray = useState(false); // 2๋ฒ const isChecked = stateHookArray[0]; const setIsChecked = stateHookArray[1]; }
isChecked ๊ฐ boolean ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ true or false ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ณด์ด๋๋ก ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
state ๊ฐฑ์ ํ๊ธฐ
state๋ฅผ ๊ฐฑ์ ํ๋ ค๋ฉด state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ธ setIsChecked ๋ฅผ ํธ์ถ
์ฌ์ฉ์๊ฐ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด onChange ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ธ handleChecked ๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๊ฐ setIsChecked ๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. setIsChecked ๊ฐ ํธ์ถ๋๋ฉด ํธ์ถ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ isChecked ๋ณ์๊ฐ ๊ฐฑ์ ๋๋ฉฐ, React๋ ์๋ก์ด isChecked ๋ณ์๋ฅผ CheckboxExample ์ปดํฌ๋ํธ์ ๋๊ฒจ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง
function CheckboxExample() { const [isChecked, setIsChecked] = useState(false); const handleChecked = (event) => { setIsChecked(event.target.checked); }; return ( <div className="App"> <input type="checkbox" checked={isChecked} onChange={handleChecked} /> <span>{isChecked ? "Checked!!" : "Unchecked"}</span> </div> ); }
React state ์ฃผ์์
React ์ปดํฌ๋ํธ๋ state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋กญ๊ฒ ํธ์ถ๋๊ณ , ๋ฆฌ๋ ๋๋ง ๋ฉ๋๋ค.
React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ๋ฉด ์ ๋ฉ๋๋ค. ์ํ ๋ณ๊ฒฝ ํจ์ ์ฌ์ฉ์ React์ ๊ฐ๋ฐ์์ ์ฝ์์ด๊ธฐ ๋๋ฌธ์ ์ง์ผ์ฃผ์ ์ผ ํฉ๋๋ค. ๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค๊ฑฐ๋, state๊ฐ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
๋ฐ์ํ'codeStates front-end > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์ค์ต - React Twittler State & Props (0) 2023.01.30 [React] ์ด๋ฒคํธ ์ฒ๋ฆฌ & Controlled Component & React ๋ฐ์ดํฐ ํ๋ฆ (0) 2023.01.26 [React] ์ค์ต - react twittler SPA (0) 2023.01.25 [React] SPA, Router (0) 2023.01.25 [React] ์ค์ต - react twittler (1) 2023.01.20