[React] Movie-app Notes - State (2) Good Way

KAYAยท2021๋…„ 11์›” 7์ผ
0

[React] Movie-App

๋ชฉ๋ก ๋ณด๊ธฐ
3/11

๐Ÿ“’ Nomad Coder ReactJS๋กœ ์˜ํ™” ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ
๊ฐ•์˜๋…ธํŠธ (2021 Updated ver.)


#3. State

๐Ÿ‘ ๋ฐฉ๋ฒ• = State ์‚ฌ์šฉํ•˜๊ธฐ

React.js ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋ฉฐ, render()์„ ๋งค๋ฒˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

1. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ธฐ๋ณธ ๊ตฌ์กฐ๋งŒ ๋‚จ๊ฒจ๋‘” ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์ž

<script type="text/babel">
  const root = document.getElementById("root")
  function App() {
    return (
      (
        <div>
          <h3>Tocal Click : 0</h3>
          <button>Click me!</button>
        </div>
      )
    )
  }
  ReactDOM.render(<App />, root);
</script>

2. React์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด data์™€ function์„ ๊ตฌํ˜„ํ•˜์ž

React.useState()๋Š” data์™€ function์„ ํฌํ•จํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค => State์˜ ์ƒ์„ฑ
State : ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

์ด ํ•œ ์ค„๋กœ ๊ธฐ์กด์— Bad Way์—์„œ ์ผ๋˜ ์ˆ˜ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

  • data :
let count = 0;
  • function :
function counterUp() {
  count += 1
}

React.js๊ฐ€ ์ œ๊ณตํ•˜๋Š” useState()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š”
'์ธ๋ฑ์Šค์˜ ๋‘๋ฒˆ์งธ ๊ฐ’ [1]'
=== 'setCounter'
=== 'function'์œผ๋กœ ์ด๋ฒคํŠธ ์ƒ์„ฑ๊ณผ ํ•จ๊ป˜ ์ž๋™ ๋ฆฌ๋ Œ๋”๋ง(UI update)๊นŒ์ง€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ(App())์„ ๋ฆฌ๋ Œ๋”๋งํ•˜๊ณ  UI ์š”์†Œ์—์„œ ๋ฐ”๋€” ๋ถ€๋ถ„์„ refreshํ•œ๋‹ค.
state๊ฐ€ ๋ฐ”๋€Œ๋ฉด -> new value๋ฅผ ๊ฐ€์ง€๊ณ  - > rendering application

3. state ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

1. ์ •์ ์œผ๋กœ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

setCounter(123)
setCounter('abc')

์•„์˜ˆ ์ •ํ•ด์ง„ ๊ฐ’์„ modifier์— ์ ์šฉํ•ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋‹ค.

2. ํ•จ์ˆ˜๋กœ ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ

์œ„์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ ์ฝ”๋“œ์—์„œ ๋ฐ”๋กœ ์ด ๋ฐฉ๋ฒ•์„ ์ผ๋‹ค.

 function App() {
    const [counter, setCounter] = React.useState(0);
    const onClick = () => {
      setCounter(counter + 1)
    };
  • counter : ํ˜„์žฌ state (value)
  • setCounter : modifier

์œ„๋Š” ํ˜„์žฌ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๊ณ  1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ฐ’์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค ( -> ์ง€๊ธˆ์€ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋จ).

์šฐ๋ฆฌ๋Š” 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, 
counter๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ update๋˜์–ด ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฐ’์ด ๋˜๋ฉด 
์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์ด ๊ณ„์‚ฐ๋˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

=> ๊ทธ๋ž˜์„œ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํ™•์‹คํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ 'ํ˜„์žฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š” ๋ฐฉ๋ฒ•'์€ counter value์„ ๊ธฐ์ค€์œผ๋กœ ๋‘์ง€ ์•Š๊ณ , ํ˜„์žฌ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

setCounter(current => current + 1)

modifier์˜ ๋กœ์ง์€ ํ•จ์ˆ˜๋กœ๋„ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ state์˜ ํ˜„์žฌ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๊ณ (counter์— 0์„ ๋„ฃ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋‚ด๊ฐ€ ์ง€์ •ํ•˜์ง€ ์•Š์Œ), current๊ฐ’์— 1์„ ๋”ํ•ด์ฃผ๋Š” ๋กœ์ง์„ ๋งŒ๋“ค๋ฉด ๊ธฐ์กด์— ์ผ๋˜ ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜์ง€๋งŒ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ƒˆ๋กœ์šด state๊ฐ’์„ updateํ•  ์ˆ˜ ์žˆ๋‹ค.

 function App() {
    const [counter, setCounter] = React.useState(0);
    const onClick = () => {
      setCounter(current => current + 1)
    };

Summary

State๋Š” React์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. State๋Š” value(๊ฐ’), modifier(๋ณ€ํ˜• ํ•จ์ˆ˜) ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๊ฐ€์ง€๋ฉฐ, modifier์˜ ๋กœ์ง์— ๋”ฐ๋ผ value๊ฐ€ ์„ค์ •๋œ๋‹ค.
์ด ๋•Œ, State์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋ Œ๋”๋ง์ด ์ž๋™์ ์œผ๋กœ ์ผ์–ด๋‚˜๊ณ  ๊ทธ ๊ฐ’์ด UI์— ํ‘œ๊ธฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ State๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ €๋ฒˆ์ฒ˜๋Ÿผ render()์„ ๋งค๋ฒˆ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

profile
๊ฒ…๋ถ€ํ•˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€