๐Ÿ“˜React ๊ธฐ์ดˆ ์ •๋ฆฌ 3

@leekh8 ยท May 05, 2023 ยท 3 min read

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 ๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•

  1. setState ๋‚ด์— ๋ณ€๊ฒฝํ•  ๊ฐ’ ๋„ฃ๊ธฐ
const [count, setCount] = useState(0)
setCount(count + 1)
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ง์ ‘ ๋ณ€๊ฒฝํ•  ๊ฐ’์„ setState์— ๋„ฃ์–ด์ค€๋‹ค.
  1. 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

@leekh8
Hello :)