[React] props, state
Categories: react
Tags: react, ๊ฐ๋ ์ ๋ฆฌ
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
React state & Props
state, props์ ๊ฐ๋
- State
- ์ด๋ฉด์ ๋ณํ ์ ์๋ ๊ฐ
- ์ปดํฌ๋ํธ์ ์ฌ์ฉ ์ค ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ณํ ์ ์๋ ๊ฐ
- Props
- ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ ๋ฐ์ ๊ฐ
- State vs Props
- Tweeter์ ์๋ ์์ฑ๊ฐ๋ค์ State์ผ๊น? Props์ผ๊น?
- ํ๋์ ์ปดํฌ๋ํธ์ ๊ท์๋ ๊ฐ์ด ์๋๊ธฐ ๋๋ฌธ์ Props์ ํด๋น.
-
[์ด๋ฆ/์ฑ๋ณ/๋์ด/ํ์ฌ์ฌ๋ ๊ณณ/์ทจ์ ์ฌ๋ถ/๊ฒฐํผ-์ฐ์ ์ฌ๋ถ] - ์ด๋ค ๊ฒ์ด Props or State์ ์ ํฉํ์ง?
Props State ์ด๋ฆ ๋์ด ์ฑ๋ณ ํ์ฌ ์ฌ๋ ๊ณณ ย ์ทจ์ ์ฌ๋ถ ย ๊ฒฐํผ-์ฐ์ ์ฌ๋ถ - Toggle Switch
- On / Off ์ฌ๋ถ๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋จ
- State์ ํด๋น
-
Couter
- State ํด๋น
- Tweeter์ ์๋ ์์ฑ๊ฐ๋ค์ State์ผ๊น? Props์ผ๊น?
Props
- Props์ ํน์ง
- ์ปดํฌ๋ํธ์ ์์ฑ(property)์ ์๋ฏธ
- props๋ ์ฑ๋ณ์ด๋ ์ด๋ฆ์ฒ๋ผ ๋ณํ์ง ์๋ ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง ์์ฑ์ ํด๋น
- ๐๋ถ๋ชจ ์ปดํฌ๋ํธ(์์ ์ปดํฌ๋ํธ)๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐโจโจโจโจโจโจโจ
- ๋ฌด์กฐ๊ฑด ๋ด ์์์ ์ปดํฌ๋ํธ๋ง ๊ฐ๋ฅํจ ์กฐ์์ ์๋จ.
- React ์ปดํฌ๋ํธ๋ JavaScript ํจ์์ ํด๋์ค๋ก, props๋ฅผ ํจ์์ ์ ๋ฌ์ธ์(arguments)์ฒ๋ผ ์ ๋ฌ๋ฐ์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง๋ฅผ ๊ธฐ์ ํ๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํ ๋ฐ๋ผ์, ์ปดํฌ๋ํธ๊ฐ ์ต์ด ๋ ๋๋ง ๋ ๋ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ด๊น๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์
-
๊ฐ์ฒด ํํ์ ๋๋ค.
props๋ก ์ด๋ค ํ์ ์ ๊ฐ๋ ๋ฃ์ด ์ ๋ฌํ ์ ์๋๋ก props๋ ๊ฐ์ฒด์ ํํ๋ฅผ ๊ฐ์ง
- props๋ ์ฝ๊ธฐ ์ ์ฉ
- props๋ ์ฑ๋ณ์ด๋ ์ด๋ฆ์ฒ๋ผ ์ธ๋ถ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ณํ์ง ์๋ ๊ฐ
- ๊ทธ๋์ props๋ ํจ๋ถ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ์ฝ๊ธฐ ์ ์ฉ(read-only) ๊ฐ์ฒดโ ํจ๋ถ๋ก ๋ณ๊ฒฝ๋์ง ์์์ผ ํ๊ธฐ ๋๋ฌธ
- ์ปดํฌ๋ํธ์ ์์ฑ(property)์ ์๋ฏธ
- Props ์ฌ์ฉ ๋ฐฉ๋ฒ
- props๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 3๋จ๊ณ ์์๋ก ๋๋ ์ ์์
- ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๊ฐ(data)๊ณผ ์์ฑ์ ์ ์
- props๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ ๊ฐ๊ณผ ์์ฑ์ ์ ๋ฌ
- ์ ๋ฌ๋ฐ์ props๋ฅผ ๋ ๋๋งํ๋ค.
-
์์ -1
App์ด ์ต์์ ์ปดํฌ๋ํธ
- Props๋ ๋ฐ์ดํฐ๋ฅผ ์์์ ๋ฐ์ ๋ชป ๋ฐ๊ธฐ ๋๋ฌธ์ Tweets์ Mypage ๋ ๋ค ๊ฐ์ ๋ฐ์ดํฐ ํ์ํ ๊ฒฝ์ฐ์๋ ์๋ก ๊ณต์ ๋ฅผ ๋ชปํ๋ฏ๋ก ๋ฐ์ดํฐ๋ app์์ ๊ฐ์ง๊ณ ์์ด์ผ ํจ.
- ์๋์์ ์๋ก๋ ์ ๋ ์ ๋ณด ๋ชป๋ณด๋
- ๋ง์ฝ footer์์ app์ด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ ํ์ํ ๊ฒฝ์ฐ์๋ app์์ tweet์์ ๋ด๋ฆฌ๊ณ tweet์์ footer๋ก ํ๋ฒ ๋ ๋ด๋ ค์ผ ํจ.
- ๊ทธ๋ผ ๋ชจ๋ props๋ฅผ ์ต์์์ ๋๋ฉด ๋์ง ์์๊น?? โ ์ํ๋ฅผ ๋ชจ๋ ์ ์ญ๋ณ์๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ๊ฒ์. ์ํ๋ฅผ ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์, ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ ๊ฒฝ์ฐ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ์์ฆ ์ฑ์ Props ์์ฒญ ๋ง๊ณ ์ปดํฌ๋ํธ๋ ๋ง์์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์, ์๋ํํฐ์์ ๊ด๋ฆฌ, ์ง์ํด์ฃผ๋ ์ํ๊ด๋ฆฌ ํด์ด ์์ but, ๋ฐ์ดํฐ ๋ง์ง ์์๋ฐ ํด ์ฌ์ฉ์ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ
-
์์ -2
1 2 3 4 5 6 7 8 9 10 11 12
function Parent() { return ( <div className="parent"> <h1>I'm the parent</h1> <Child /> </div>); }; function Child() { return ( <div className="child"></div>); };
- props๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ์
<Parent>
์<Child>
๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ ,<Parent>
์ปดํฌ๋ํธ ์์<Child>
์ปดํฌ๋ํธ๋ฅผ ์์ฑ -
์ปดํฌ๋ํธ ์์ฑ ํ ์ ๋ฌํ๊ณ ์ ํ๋ ์์ฑ์ ์ ์
1
<a href="www.javascript.com">Click me to visit javascript</a>
-
React์์ JSX ์์ฑ ๋ฐ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ-1
1
<Child attribute={value} />
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ๋ ๋ณ์๋ฅผ ๋ฃ์ ๊ฒ์ด๋ผ์ ์ค๊ดํธ ์ฌ์ฉ
-
React์์ JSX ์์ฑ ๋ฐ ๊ฐ์ ํ ๋นํ๋ ๋ฐฉ๋ฒ 2
1
<Child text={"I'm the eldest child"} />
-
parent ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฐฉ๋ฒ =
<Child>
์ปดํฌ๋ํธ์์ props ๋งค๊ฐ๋ณ์ ์ฌ์ฉ ์์1 2 3 4 5
function Child(props) { return ( <div className="child"></div> ); };
props๋ ๊ณ ์ ์ด๊ณ ๋ฐ๊ฟ ์ ์๋ค. props ํ์ ์ ๊ฐ์ฒด์ธ๋ฐ ์ค์ ๋ค์ด์จ ๊ฐ์ text์ธ๋ฐ props์์ ์ด๋ป๊ฒ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์๊น?
์ค์ ๋ก props๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด props ={โtextโ : โIโm the eldest childโ }
์ฆ props.text๋ก ์ ๊ทผ ํ๋ ๊ฒ์.
- ์ ๋ฌ๋ฐ์ props ๋ ๋๋ง ํ๊ธฐ
- props๋ ๊ฐ์ฒด๋ผ์ key value ํํ๋ฅผ ๋ฐ
- ์ฌ๊ธฐ์๋ parent ์ปดํฌ๋ํธ์์ ์ ์ํ
{ attribute : value }
์ ํํ๋ฅผ ๋ ๊ฒ ๋จ - props์ value ๋ํ dot notation์ผ๋ก ์ ๊ทผํ ์ ์์.
1 2 3 4 5 6 7
function Child(props) { return ( <div className="child"> <p>{props.text}</p> </div> ); };
-
์ค์ต-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
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;
์ค์ต-2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import "./styles.css"; const App = () => { const itemOne = "React๋ฅผ"; const itemTwo = "๋ฐฐ์ฐ๊ณ ์์ต๋๋ค."; return ( <div className="App"> {/* Learn ์ปดํฌ๋ํธ์ itemOne ๊ณผ itemTwo ๋ฅผ props ๋ก ์ ๋ฌํ์ธ์ */} <Learn items={[itemOne,itemTwo]}/>; </div> ); }; const Learn = (props) => { // ์ ๋ฌ๋ฐ์ props ๋ฅผ ์๋ <div> tag ์ฌ์ด์ ์ฌ์ฉํ์ฌ // "React๋ฅผ ๋ฐฐ์ฐ๊ณ ์์ต๋๋ค" ๋ผ๋ ๋ฌธ์ฅ์ด ๋ ๋๋ง๋๋๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ธ์ return <div className="Learn">{props.items[0]+" "+props.items[1]}</div>; }; export default App;
- props๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ์
- props๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด 3๋จ๊ณ ์์๋ก ๋๋ ์ ์์
State
์ปดํฌ๋ํธ ๋ด์์ ๋ณํ ์ ์๋ ๊ฐ, ์ฆ ์ํ๋ React state๋ก ๋ค๋ค์ผ ํจ.
๋ค๋ชจ ๋ฐ์ค์ ์๋ ๊ฐ๋ค์ ๋ณํ ์ ์๋ ๊ฐ.
State hook, useState
React์์๋ state ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก useState
๋ผ๋ ํน๋ณํ ํจ์๋ฅผ ์ ๊ณต
1
2
3
function CheckboxExample() {
const [isChecked, setIsChecked] = useState(false);
// const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(state ์ด๊น๊ฐ);
- isChecked : state๋ฅผ ์ ์ฅํ๋ ๋ณ์
- setIsChecked : state isChecked ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
- useState : state hook
- false : state ์ด๊น๊ฐ
์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ์๋๋ฐฉ์์ ์๋์ ๊ฐ์.
-
React๋ก๋ถํฐ
useState
๋ฅผ ๋ถ๋ฌ์ค๊ธฐ - import ํค์๋1
import { useState } from "react";
- ์ดํ usestate๋ฅผ ์ปดํฌ๋ํธ ์์์ ํธ์ถ
- ํธ์ถ์ด๋ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ๊ณผ ๊ฐ์, ๋ณ์ ์ด๋ฆ์ ์๊ด ์์
- ์ผ๋ฐ์ ์ธ ๋ณ์๋ ์ฌ๋ผ์ง์ง๋ง state ๋ณ์๋ React์ ์ํด ํจ์๊ฐ ๋๋๋ ์ฌ๋ผ์ง์ง ์์
1 2 3 4
function CheckboxExample() { // ์๋ก์ด state ๋ณ์๋ฅผ ์ ์ธํ๊ณ , ์ฌ๊ธฐ์๋ ์ด๊ฒ์ isChecked ๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. const [isChecked, setIsChecked] = useState(false); }
isChecked
,setIsChecked
๋useState
์ ๋ฆฌํด ๊ฐ์ ๊ตฌ์กฐ ๋ถํด ํ ๋นํ ๋ณ์ โ ์ด ํ์ ์ธ์์ผ ํจ.-
์๊ธฐ ์ฝ๋๋ฅผ ํ์ด์ฐ๋ฉด ์๋ ์ฝ๋์ ๊ฐ์
1 2 3 4 5
function CheckboxExample() { const stateHookArray = useState(false); // 2๋ฒ const isChecked = stateHookArray[0]; const setIsChecked = stateHookArray[1]; }
-
- usestate๋ ์ ์ธ๊ณผ ํ ๋น์ ๋์์ ํ๋ ๊ฒ์. ์ด๊ธฐ ๊ฐ์ด false ์
-
์ฌ๊ธฐ์ isChecked๋ ๋ณ์ setIsChecked๋ ํจ์.
1
const [state ์ ์ฅ ๋ณ์, state ๊ฐฑ์ ํจ์] = useState(์ํ ์ด๊ธฐ ๊ฐ);
- const๊ฐ ๋ค์ด ์์ ์ฌํ ๋น์ด ์ ๋๋๋ฐ setIsCheked ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ์๋ก๊ณ ์นจ ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋จ
- let์ ๋ถ์ด๋ฉด ๋ซ์ง ์์๊น ??์๊ฐํ๋๋ฐ ์๋ก๊ณ ์นจ์ด ๋๋ ๊ฒ์ด ๋๋ถ๋ถ์ด๋ผ์ ํ๋ฉด ์ด๋๊ฐ๊ฐ ๋ฐ๊ปด์ผ ํ๊ธฐ ๋๋ฌธ
โ ํ๋ฉด์ด ๋ฐ๋๊ธฐ ์ ๊น์ง๋ ๋ถ๋ณ์ - ์ดํด์๊ฐ๋ ์ธ์์ผ ํจ! โก๏ธ react์ฌ์ดํธ์ ๊ณต์๋ฌธ์์ ์ ํ์๊ธฐ ๋๋ฌธ, const๋ ๊ณ ์ ์ด๋ค
= ๋ค์ํ๋ฉด์ด ๋ง๋ค์ด์ง๋ค๋ ๊ฒ์ ๊ฐ์กฐ
- let์ ๋ถ์ด๋ฉด ๋ซ์ง ์์๊น ??์๊ฐํ๋๋ฐ ์๋ก๊ณ ์นจ์ด ๋๋ ๊ฒ์ด ๋๋ถ๋ถ์ด๋ผ์ ํ๋ฉด ์ด๋๊ฐ๊ฐ ๋ฐ๊ปด์ผ ํ๊ธฐ ๋๋ฌธ
- state๊ฐ ๋ณ๊ฒฝ๋๋ ์๊ด ์๋ก๊ณ ์นจ ๋ ์ฑ๋ก ๋ค์ ์์. dom์ ๋ค์ ์ ๊ฒํจ.
- state ๊ฐ์ ๋ค์ด์ฌ ์ ์๋ ํ์ ์ ์ ํ ์์.
- ์ด๊ธฐ ๊ฐ์ ๋ฐฐ์ด์ ๋ฃ๊ณ ์ถ์ผ๋ฉด false ์๋ฆฌ์ ๋น ๋ฐฐ์ด ๋ฃ์ผ๋ฉด ๋จ.
- ํจ์ ๋ค์ด์ฌ ์ ์์ง๋ง ๋ฃ๋ ๊ฒฝ์ฐ ์๋ค
-
์ด state ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด JSX ์๋ฆฌ๋จผํธ ์์ ์ง์ ๋ถ๋ฌ์ ์ฌ์ฉ,
์ฌ๊ธฐ์๋isChecked
๊ฐ boolean ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์true
orfalse
์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ณด์ด๋๋ก ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉ1
<span>{isChecked ? "Checked!!" : "Unchecked"}</span>
-
State ๊ฐฑ์ ํ๊ธฐ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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๋ฅผ ๊ฐฑ์ ํ๋ ค๋ฉด state ๋ณ์๋ฅผ ๊ฐฑ์ ํ ์ ์๋ ํจ์์ธ setIsChecked ๋ฅผ ํธ์ถ
- ์์์ ๊ฒฝ์ฐ, input[type=checkbox] JSX ์๋ฆฌ๋จผํธ์ ๊ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ์ isChecked ๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํจ.
๋ธ๋ผ์ฐ์ ์์ checked๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๋ฉด, React์ isChecked ๋ ๋ณ๊ฒฝ๋์ด์ผ ํจ. - input[type=checkbox] ์๋ฆฌ๋จผํธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์
- ์ฌ์ฉ์๊ฐ ์ฒดํฌ๋ฐ์ค ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด onChange ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์์ธ handleChecked ๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๊ฐ setIsChecked ๋ฅผ ํธ์ถํ๊ฒ ๋จ
- setIsChecked ๊ฐ ํธ์ถ๋๋ฉด ํธ์ถ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ isChecked ๋ณ์๊ฐ ๊ฐฑ์ ๋๋ฉฐ, React๋ ์๋ก์ด isChecked ๋ณ์๋ฅผ CheckboxExample ์ปดํฌ๋ํธ์ ๋๊ฒจ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง ํจ
-
๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ ์๋จ
- React state๋ ์ํ ๋ณ๊ฒฝ ํจ์ ํธ์ถ๋ก ๋ณ๊ฒฝํด์ผ ํจ. โ ๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ๋ฉด ์ ๋จ.
- ์ํ ๋ณ๊ฒฝ ํจ์ ์ฌ์ฉ์ React์ ๊ฐ๋ฐ์์ ์ฝ์์.
- ๊ฐ์ ๋ก ๋ณ๊ฒฝ์ ์๋ํ๋ฉด, ๋ฆฌ๋ ๋๋ง์ด ๋์ง ์๋๋ค๊ฑฐ๋, state๊ฐ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์์.
- ์์ :
state.push(1);
,state[1] = 2;
,state = 'wrong state';
-
์์ -1
- ํด๋น ๋ถ๋ถ๋ง ๋ณ๊ฒฝ๋๋ ๊ฒ. ๋ฐํ๋๋ ๊ฒฐ๊ณผ๋ ๋ ๋๋ง๋๋ ํ๋ฉด, ์ผ๋ถ๋ง ๋ ๋๋ง ์ฆ , ์ปดํฌ๋ํธ์ด๋ค. = check๋ฐ์ค์ ๋ํ.
- onChange={handleChecked} />์ ๋ณํ๊ฐ ์์ผ๋ฉด handleChecked๊ฐ ์คํ๋๋ ๊ฒ.
- state ๋ฐ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋๋๋ง ๋จ.
-
์๋ ์ฝ๋ ๋๋๋ง์ด ์๋จ, ๊ผญ ํผํด์ผ ๋๋ ๊ฒฝ์ฐ
-
ํ๋์ ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ๊ฐ์ ์ํ๋ฅผ ๊ฐ์ง ์ ์์ . ๋ค๊ฐ์ ์ฒดํฌ๋ฐ์ค๋ฅผ ๋ง๋ค๋ฉด ๋ค๊ฐ์ ์ปดํฌ๋ํธ
์ด๋ฒคํธ์ฒ๋ฆฌ
React์ ์ด๋ฒคํธ ์ฒ๋ฆฌ(์ด๋ฒคํธ ํธ๋ค๋ง; Event handling) ๋ฐฉ์์ DOM์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์๊ณผ ์ ์ฌ
- React ์์ ์ด๋ฒคํธ๋ ์๋ฌธ์ ๋์ ์นด๋ฉ ์ผ์ด์ค(camelCase) ๋ฅผ ์ฌ์ฉ
- JSX๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ด ์๋ ํจ์๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์(์ด๋ฒคํธ ํธ๋ค๋ฌ; Event handler)๋ฅผ ์ ๋ฌ
-
HTML์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฐฉ์
1
<button onclick="handleEvent()">Event</button>
-
React ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฐฉ์
1
<button onClick={handleEvent}>Event</button>
example
- onChange
<input>
<textarea>
<select>
์ ๊ฐ์ ํผ(Form) ์๋ฆฌ๋จผํธ๋ ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ- React ์์๋ ์ด๋ฌํ ๋ณ๊ฒฝ๋ ์ ์๋ ์ ๋ ฅ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ state ๋ก ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธ ํจ
- onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด e.target.value ๋ฅผ ํตํด ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ฒจ์๋ input ๊ฐ์ ์ฝ์ด์ฌ ์ ์์
-
์์ -1
1 2 3 4 5 6 7 8 9 10 11 12 13
function NameForm() { const [name, setName] = useState(""); const handleChange = (e) => { setName(e.target.value); } return ( <div> <input type="text" value={name} onChange={handleChange}></input> <h1>{name}</h1> </div>) };
- ์ปดํฌ๋ํธ return ๋ฌธ ์์ input ํ๊ทธ์ value ์ onChange ๋ฅผ ๋ฃ์
- onChange ๋ input ์ ํ ์คํธ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฐ์ํ๋ ์ด๋ฒคํธ
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด handleChange ํจ์๊ฐ ์๋ํ๋ฉฐ, ์ด๋ฒคํธ ๊ฐ์ฒด์ ๋ด๊ธด input ๊ฐ์ setState ๋ฅผ ํตํด ์๋ก์ด state ๋ก ๊ฐฑ์
-
์์ -2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import React, { useState } from "react"; import "./styles.css"; function SelectExample() { const [choice, setChoice] = useState("apple"); const fruits = ["apple", "orange", "pineapple", "strawberry", "grape"]; const options = fruits.map((fruit) => { return <option value={fruit}>{fruit}</option>; }); console.log(choice); const handleFruit = (event) => { //TODO : select tag ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ธ์. **setChoice(event.target.value);** }; return ( <div className="App"> <select onChange={handleFruit}>{options}</select> <h3>You choose "{choice}"</h3> </div> ); } export default SelectExample;
- onClick : ํด๋ฆญํ์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ
- ํด๋ฆญํ์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ
- ๋ฒํผ์ด๋
<a>
tag ๋ฅผ ํตํ ๋งํฌ ์ด๋ ๋ฑ๊ณผ ๊ฐ์ด ์ฃผ๋ก ์ฌ์ฉ์์ ํ๋์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ํด์ผ ํ ๋ ์์ฃผ ์ฌ์ฉํ๋ ์ด๋ฒคํธ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
function NameForm() { const [name, setName] = useState(""); const handleChange = (e) => { setName(e.target.value); } return ( <div> <input type="text" value={name} **onChange**={handleChange}></input> <button **onClick**={alert(name)}>Button</button> <h1>{name}</h1> </div>); };
onChange
์์์ ๋ฒํผ์ ์ถ๊ฐํ์ฌ ๋ฒํผ ํด๋ฆญ ์input
tag ์ ์ ๋ ฅํ ์ด๋ฆ์ด alert์ ํตํด ์๋ฆผ ์ฐฝ์ด ํ์ ๋๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํจonClick
์ด๋ฒคํธ์ alert(name) ํจ์๋ฅผ ๋ฐ๋ก ํธ์ถํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ํจ์ ์์ฒด๊ฐ ์๋ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐonClick
์ ์ ์ฉ- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ ํด๋ฆญํ ๋๊ฐ ์๋, ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋์ alert ์ด ์คํ๋๊ณ ๋ฐ๋ผ์ ๊ทธ ๊ฒฐ๊ณผ์ธ undefined (ํจ์๋ ๋ฆฌํด ๊ฐ์ด ์์ ๋ undefined ๋ฅผ ๋ฐํ) ๊ฐ
onClick
์ ์ ์ฉ๋์ด ํด๋ฆญํ์ ๋ ์๋ฌด๋ฐ ๊ฒฐ๊ณผ๋ ์ผ์ด๋์ง ์์ - ๋ฐ๋ผ์
onClick
์ด๋ฒคํธ์ ํจ์๋ฅผ ์ ๋ฌํ ๋๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ ์๋์ ๊ฐ์ด ๋ฆฌํด๋ฌธ ์์์ ํจ์๋ฅผ ์ ์ํ๊ฑฐ๋ ๋ฆฌํด๋ฌธ ์ธ๋ถ์์ ํจ์๋ฅผ ์ ์ ํ ์ด๋ฒคํธ์ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํด์ผ ํจ. -
์์ : **
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// ํจ์ ์ ์ํ๊ธฐ return ( <div> ... <button onClick={() => alert(name)}>Button</button> ... </div>); }; // ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํ๊ธฐ const handleClick = () => { alert(name); }; return ( <div> ... <button onClick={handleClick}>Button</button> ... </div>); };
โ ๋ง๊ฒ ์ด ์์
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import "./styles.css"; import React, { useState } from "react"; function NameForm() { const [name, setName] = useState(""); const handleChange = (e) => { setName(e.target.value); }; const handleClick = () => { alert(name); }; return ( <div className="App"> <h1>Event handler practice</h1> <input type="text" value={name} onChange={handleChange}></input> **<button onClick={handleClick}>Button</button>** {/* <button onClick={() => alert(name)}>Button</button> */} **<h3>{name}</h3>** </div> ); } export default NameForm;
์ ๋ ฅ์ฐฝ์ ์ถ๋ ฅ๋๋๊ฒ์ <h3>{name}</h3} ์ ์ํ ๊ฒ.
-
์์ : Pop up
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
import React, { useState } from "react"; import "./styles.css"; function App() { const [showPopup, setShowPopup] = useState(false); const togglePopup = () => { // Pop up ์ open/close ์ํ์ ๋ฐ๋ผ // ํ์ฌ state ๊ฐ ์ ๋ฐ์ดํธ ๋๋๋ก ํจ์๋ฅผ ์์ฑํ์ธ์. const currenstate = showPopup ? false : true; setShowPopup(currentstate); }; return ( <div className="App"> <h1>Fix me to open Pop Up</h1> {/* ๋ฒํผ์ ํด๋ฆญํ์ ๋ Pop up ์ open/close ๊ฐ ์๋ํ๋๋ก button tag๋ฅผ ์์ฑํ์ธ์. */} <button className="open">Open me</button> {showPopup ? ( <div className="popup"> <div className="popup_inner"> <h2>Success!</h2> <button className="close" onClick={togglePopup}> Close me </button> </div> </div> ) : null} </div> ); } export default App;
Controlled component : React๊ฐ state๋ฅผ ํต์ ํ ์ ์๋ ์ปดํฌ๋ํธ
https://reactwithhooks.netlify.app/docs/forms.html - ์์ธํ ๋ด์ฉ์ ๊ณต์๋ฌธ์ ์ฐธ๊ณ
input์ ๊ฐ ์ ๋ ฅ ์, state๋ ๊ทธ๋๊ทธ๋ ๋ฐ๋๋ฉด(onChange) ๋๊ณ ์ด ๋ณ๊ฒฝ๋ state์ input์ value ๋ํ ๊ฐ๊ฒ ์์ฑํด์ผ ํจ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import "./styles.css";
import React, { useState } from "react";
export default function App() {
const [username, setUsername] = useState("");
const [msg, setMsg] = useState("");
return (
<div className="App">
<div>{username}</div>
<input
type="text"
value={username}
onChange={(event) => setUsername(event.target.value)}
placeholder="์ฌ๊ธฐ๋ ์ธํ์
๋๋ค."
className="tweetForm__input--username"
></input>
<div>{msg}</div>
{/* TODO : ์ input๊ณผ ๊ฐ์ด ์
๋ ฅ์ ๋ฐ๋ผ์ msg state๊ฐ ๋ณํ ์ ์๊ฒ
์๋ textarea๋ฅผ ๋ณ๊ฒฝํ์ธ์. */}
<textarea
placeholder="์ฌ๊ธฐ๋ ํ
์คํธ ์์ญ์
๋๋ค."
className="tweetForm__input--message"
onChange={(event) => {SetMsg(event.target.value}}
value={"msg"}
></textarea>
</div>
);
}
React ๋ฐ์ดํฐ ํ๋ฆ
-
์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด๋๊ณ ํฉ์น๊ธฐ
-
์ธ๋ถํ
-
๋์ํ - ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๊ฐ ๋ง์๋ ๋์ํํ๋ ๊ฒ์ด ์ค์ํจ
-
๋ฐ์ดํฐ๋ ์์์ ์๋๋ก ํ๋ฆ. ์ด๋ํ๋ ๊ฒ์ ๋ฌด์กฐ๊ฑด props
-
singleTweet์ ๊ฐ๋ณ์ด ์๋๋ผ ๋ชจ๋ ์ฌ๋์ tweet์ ๋ด์์ผ ํ๋ฏ๋ก Tweets๊ฐ ๊ฐ์ง๊ณ ์์ด์ผ ํจ. ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฌ์ผ ํ๊ธฐ ๋๋ฌธ
๋ฐฉ๋ฒ์ ์ฌ์ค 2๊ฐ์ง๊ฐ ์์
search๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๋ชฉ๋ก์ด twittler์์ search์ tweets์ ๋ด๋ ค์ฃผ๊ณ singletweet์ ๊ฐ๊ฐ ๋ค์ ๋ด๋ฆฌ๊ธฐ
search๊ฐ filtering์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํํฐ๋ ์กฐ๊ฑด์ singleTweet
์ด์ ๋ฏผ์ด ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ง singleTweet์ผ๋ก ๊ฐ์ง๋ฉด๋๋๊น
์ ์ฒด ํธ์๋ชฉ๋ก์ด ์ต์์๊ฐ ๊ฐ๊ณ ์๋๊ฒ์ ์ข์ง ์์. = ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ณ์ ์์ฃผํด ์์ด์
Leave a comment