React ๊ธฐ์ด ์ ๋ฆฌ ๐
Props์ State: React ์ปดํฌ๋ํธ์ ํต์ฌ ์ดํดํ๊ธฐ ๐
React๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํด ๋ฐ๋์ ์์์ผ ํ ๋ ๊ฐ์ง ๊ฐ๋ , Props์ State์ ๋ํด ์์ธํ ์์๋ณด์.1
๐ฆ Props๋? ๐ค
Props๋ properties์ ์ค์๋ง๋ก, ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ๋ ์ ๋ ฅ๊ฐ์ด๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ค ์ ์๋ค.
-
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐ ๏ธ
// ์ปดํฌ๋ํธ ์์ฑ const Welcome = props => { return <h1>Hello, {props.name} ๐</h1> } // ์ปดํฌ๋ํธ ์ฌ์ฉ const App = () => { return ( <div> <Welcome name="Amy" /> <Welcome name="Andy" /> <Welcome name="Sapiens" /> </div> ) }
-
Props๋ ์ฝ๊ธฐ ์ ์ฉ.
-
์ปดํฌ๋ํธ ๋ด์์ Props๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ๋ฉด ์ ๋๋ค. ๐ซ
// ์๋ชป๋ ์ const Welcome = props => { let greeting = "Sir " + props.name // ์ด๋ ๊ฒ ์ฌ์ฉํ์ธ์! return <h1>Hello, {greeting}</h1> }
๐จ JSX์ HTML์ ์ฐจ์ด์
JSX์์๋ HTML๊ณผ ๋ค๋ฅด๊ฒ ์์ฑ๋๋ ์์ฑ๋ค์ด ์๋ค. ์๋ฅผ ๋ค์ด, class๋ className์ผ๋ก, for๋ htmlFor๋ก ์ฌ์ฉ๋๋ค.
- CamelCase ์ฌ์ฉ ๐ซ
<div tabIndex="0"></div>
- data-์ aria- ์์ฑ์ ๊ทธ๋๋ก ์ฌ์ฉ โ
<div aria-label="Close" data-testid="close-button"></div>
๐พ State๋? ๐ค
State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ๋ฐ์ดํฐ์ด๋ค. ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
-
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐ ๏ธ
import { useState } from "react" function Counter() { const [count, setCount] = useState(0) return ( <div> <p>You clicked {count} times ๐ฅ</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> ) }
-
State ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋ฐ๋์ setState ํจ์(์ฌ๊ธฐ์๋ setCount)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ๐2
์ด๋ ๊ฒ Props์ State๋ฅผ ์ดํดํ๊ณ ํ์ฉํ๋ฉด, React์์ ๋์ฑ ๋์ ์ด๊ณ ๋ฐ์์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค! ๐
State๋ฅผ ๋ณ๊ฒฝํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ๊ณผ Object๋ฅผ ๊ฐ๋ State๋ฅผ ๋ง๋ค ๋ ์ฃผ์ํ ์ ๐ ๏ธ
React์์ State๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์ค์ํ๋ค. ํนํ, State๊ฐ ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋๋ ๋์ฑ ์ฃผ์ํด์ผ ํ๋ค. State๋ฅผ ๋ณ๊ฒฝํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ State๋ฅผ ๋ง๋ค ๋ ์ฃผ์ํด์ผ ํ ์ ์ ์ดํด๋ณด์.
State ๋ณ๊ฒฝ ๋ฐฉ๋ฒ
- setState ๋ด์ ๋ณ๊ฒฝํ ๊ฐ ๋ฃ๊ธฐ
const [count, setCount] = useState(0)
setCount(count + 1)
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, ์ง์ ๋ณ๊ฒฝํ ๊ฐ์ setState์ ๋ฃ์ด์ค๋ค.
- setState์ ํจ์ ๋ฃ๊ธฐ
- ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ์ผ๋ก State ๋ณ๊ฒฝ
- ํ์ฌ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก State๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ํจ์ ๋ฃ๊ธฐ ๋ฐฉ๋ฒ์ ๊ถ์ฅ
const [count, setCount] = useState(0)
setCount(current => {
return current + 1
})
Object๋ฅผ ๊ฐ๋ State ๋ง๋ค ๋ ์ฃผ์ํ ์ ๐ ๏ธ
Object๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ State๋ ๊ฐ๋ฅํ์ง๋ง, React๊ฐ State์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด, Object ๋ด๋ถ์ ์์ฑ๋ง ๋ณ๊ฒฝ๋๊ณ Object ์์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
const [user, setUser] = useState({ name: "sapiens", age: 30 })
setUser(current => {
current.age = 29
return current
})
- ์์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด, React๋ user Object์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋, ๊ธฐ์กด Object์ ๋ด์ฉ์ ์๋ก์ด Object์ ๋ด๊ณ ๋ณ๊ฒฝํด์ผ ํ๋ค. ์ฆ, ์๋ก์ด Object๋ฅผ ์์ฑํ์ฌ ๋ฐํํด์ผ React๊ฐ State์ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋ค.
const [user, setUser] = useState({ name: "sapiens", age: 30 })
setUser(current => {
const newUser = { ...current }
newUser.age = 29
return newUser
})
- ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, user์ age๊ฐ ๋ณ๊ฒฝ๋์์ ๋ React๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค.
React์์ State๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ ์ง ๋ณด์์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค. ํนํ, Object๋ฅผ ํฌํจํ๋ State๋ฅผ ๋ค๋ฃฐ ๋๋ ๋ถ๋ณ์ฑ(Immutability)์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์ด๋ฅผ ํตํด ์์ธก ๊ฐ๋ฅํ State ๊ด๋ฆฌ์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋ฌ์ฑํ ์ ์๋ค. ๐3