[React] Fragment, props, redux

๊น€ํ˜„์„ฑยท2022๋…„ 2์›” 1์ผ
0

study

๋ชฉ๋ก ๋ณด๊ธฐ
7/9

๐Ÿค” Fragment

  • ๊ณต์‹๋ฌธ์„œ) Fragments๋Š” DOM์— ๋ณ„๋„์˜ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์ž์‹์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณต์‹๋ฌธ์„œ์˜ ์˜ˆ์‹œ๊ฐ€ ๊ต‰์žฅํžˆ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๊ฒƒ์„ ๋นŒ๋ ค์™€์„œ ์ดํ•ดํ•ด๋ณด๊ฒ ์Œ !
class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns /> // `<td>` ์—˜๋ฆฌ๋จผํŠธ๋งŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ.
        </tr>
      </table>
    );
  }
}

์œ„ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ๋ Œ๋”๋ง ๋œ html์ด ์œ ํšจํ•˜๋ ค๋ฉด ์ € <Columns />๊ฐ€ <td>์—˜๋ฆฌ๋จผํŠธ๋งŒ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ. ๊ทธ๋Ÿฌ๋‚˜ Columns ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด๋ฉด <div>๋กœ <td>๋“ค์„ ๊ฐ์‹ธ๊ณ  ์žˆ์Œ.

class Columns extends React.Component {
  render() {
    return (
      <div> // ๊ทธ๋Ÿฌ๋‚˜ <div>๋„ ํฌํ•จ๋˜์–ด ์žˆ์Œ.
        <td>Hello</td>
        <td>World</td>
      </div>
    );
  }
}

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ Table ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Œ.

<table>
  <tr>
    <div> // ์˜๋ฏธ์—†๋Š” div ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋จ.
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>

Fragments๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ !

class Columns extends React.Component {
  render() {
    return (
      <React.Fragment> // <div>๋Œ€์‹  fragment๋กœ ๊ฐ์‹ธ์คŒ.
        <td>Hello</td>
        <td>World</td>
      </React.Fragment> // <>์™€ </>๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ
    );
  }
}

์ง  ์ด์ œ Table ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Œ.

<table>
  <tr>
    <td>Hello</td>
    <td>World</td>
  </tr>
</table>
  • ๋งŒ์•ฝ, Fragments์— key๊ฐ€ ์žˆ๋‹ค๋ฉด <>๊ฐ€ ์•„๋‹Œ <React.Fragment> ๋ฌธ๋ฒ•์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์–ด์•ผ ํ•จ.
    (key๋Š” Fragment์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ)

๐Ÿ‘‰ ์žฅ์ )

  • Fragment๋Š” ๋ถˆํ•„์š”ํ•œ DOM ๋…ธ๋“œ์˜ ์ƒ์„ฑ์„ ๋ง‰๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉ.
  • css ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ํŠน๋ณ„ํ•œ ๋ถ€๋ชจ ์ž์‹๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” flexbox๋‚˜ gridbox๊ด€๊ณ„์— ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ ์‚ฌ์ด์— <div>๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋ฏ€๋กœ fragment๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ’Ÿ Fragment ์‚ฌ์šฉ ์ด์œ )

  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ๋ฐ˜ํ™˜.
    ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•์ธ JSX ๋ฅผ ์“ธ ๋•Œ,
    return ๋ฌธ ์•ˆ์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    ์ด๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿ“Œ ์‚ฌ์šฉ์‚ฌ๋ก€ )

๋‹จ์ถ• ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋‘๊ฐœ์˜ <h1> ์—˜๋ฆฌ๋จผํŠธ ๊ทธ๋ฃนํ™”

export default class FragmentComponent extends React.Component {
  render() {
    return (
      <>
        <h1> ์•ˆ๋…• </h1>
        <h1> ํ•˜์„ธ์š” </h1>
      </>
    );
  }
}



๐Ÿค” props

  • props๋Š” properties์˜ ์•ฝ์ž๋กœ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋– ํ•œ ๊ฐ’์„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ.
  • ์ผ๋ฐ˜์ ์œผ๋กœ React์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉํ–ฅ์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ โ†’ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ํ–ฅํ•จ.
    ๊ทธ๋ž˜์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ props์— ๋‹ด์•„ ์ „๋‹ฌํ•˜๊ฒŒ ๋จ. (๊ฐ์ฒด ํ˜•ํƒœ)
  • ์ž์‹์€ ๋ฐ›์•„์˜จ props๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ณ , ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•จ.
    why? ) ์ž…๋ ฅ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ˜ธ์นญํ•˜๋ฉฐ, ๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ props๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
์ˆœ์ˆ˜ ํ•จ์ˆ˜) ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ”๊พธ๋ ค ํ•˜์ง€ ์•Š๊ณ , 
          ํ•ญ์ƒ ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
๐Ÿ‘‰ ๋งŒ์•ฝ,  App ์ปดํฌ๋„ŒํŠธ์—์„œ Hello ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ name ์ด๋ผ๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•ด์ฃผ๋ ค๋ฉด

function App() {
  return (
    <Hello name="react" /> // props์— ๋‹ด์•„ ์ „๋‹ฌ
  );
}
<br/>


๐Ÿ‘‰ Hello ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด

function Hello(props) { // props๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฑฐ์ง€ !
  return <div>์•ˆ๋…•ํ•˜์„ธ์š” {props.name}</div>
}


โ“ ๋งŒ์•ฝ App ์ปดํฌ๋„ŒํŠธ์—์„œ name๊ณผ ํ•จ๊ป˜ color ๊ฐ’๋„ ์ „๋‹ฌํ•ด์คฌ๋‹ค๋ฉด ?

function Hello({ color, name }) { // ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ์ด์šฉ
  return <div style={{color}}>์•ˆ๋…•ํ•˜์„ธ์š” {name}</div> 
} // props. ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ ๊ฐ€๋Šฅ.
  • defaultProps ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์— props ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ํ•  ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.
Hello.defaultProps {
name : 'No name'
}

// ๊ทธ๋Ÿฌ๋ฉด App ์ปดํฌ๋„ŒํŠธ์—์„œ name props๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•˜์„ ๋•Œ ํ™”๋ฉด์—๋Š” No name ์ด๋ผ๊ณ  ๋ณด์—ฌ์ง.
๐Ÿ“Œ ์‚ฌ์šฉ์‚ฌ๋ก€ )

์ด๋ฆ„๊ณผ ๋‚˜์ด๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š”๋ฐ, ์ด๋ฆ„์„ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—” default ๊ฐ’์„ ์ด์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

// App ์ปดํฌ๋„ŒํŠธ
class App extends Component {
  render() {
    return (
      <div className="App">
        <MyComponent name="ivy" age="24" />
        <MyComponent age="27" />
      </div>
    );
  }
}


// MyComponent ์ปดํฌ๋„ŒํŠธ
class MyComponent extends Component
{
    render(){
        return(
            <h1>name: {this.props.name} </h1>
            <h1>age: {this.props.age} </h1>
        )
    }
}

MyComponent.defaultProps = {
    name : "์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค."
}

// ์ถœ๋ ฅ
name: ivy
age: 24

name: ์ด๋ฆ„์ด ์—†์Šต๋‹ˆ๋‹ค.
age: 27



๐Ÿค” redux

  • ๊ณต์‹๋ฌธ์„œ)
    Redux๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ
    Redux๋Š” ์•ก์…˜์ด๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • redux ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๊ฐ’์„ ์ปดํฌ๋„ŒํŠธ์— ์ข…์†์‹œํ‚ค์ง€ ์•Š๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ”๊นฅ์—์„œ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ !

์•„๋ž˜ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ์—๋„ ์ ์—ˆ์ง€๋งŒ, redux๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ํฐ ๋„์›€์ด ๋œ ๊ธ€์˜ ๋งํฌ !
https://velopert.com/3528

๐Ÿ‘‰ reducer

  • store์— ๋“ค์–ด๊ฐˆ state์™€ state ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ (์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœ์ˆ˜ํ•จ์ˆ˜ (์ž…๋ ฅ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜) ๋กœ ์ฝ”๋”ฉํ•˜๊ณ , ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•จ.
    (redux๊ฐ€ ์ด์ „ state์™€ ๋ณ€๊ฒฝ๋œ state๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฐธ์กฐ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด state๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ์ธ์‹ํ•˜๊ณ  ํ•ด๋‹น state๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์„ ์š”์ฒญํ•จ. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘์ ์œผ๋กœ state๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ฐธ์กฐ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ redux๋Š” ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๊ณ  ์ธ์‹ํ•˜์ง€ ์•Š๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Œ. ๊ทธ๋ž˜์„œ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•จ!)
์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ, ์ƒํƒœ๋ฅผ ๋ณ€ํ™” ํ•  ์ผ์ด ์ƒ๊ฒผ๋‹ค๋ฉด dispatch(action) ์ฒ˜๋Ÿผ 
dispatch๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด action์„ store์—๊ฒŒ ๋˜์ ธ์คŒ.

์ด ๋•Œ ์•ก์…˜์€ ์ƒํƒœ์— ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ฌ ๋•Œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด ! 
ํ•„์ˆ˜์ ์œผ๋กœ type์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ.

์•ก์…˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋˜๋ฉด, ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜์˜ type์— ๋”ฐ๋ผ 
์–ด๋–ป๊ฒŒ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ง€ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ '๋ฆฌ๋“€์„œ'๋ผ๊ณ  ๋ถ€๋ฆ„.

์˜ˆ๋ฅผ ๋“ค์–ด { type: 'INCREMENT' }๋ผ๋ฉด ์ˆซ์ž๋ฅผ ๋”ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ์ž„.

๋ฆฌ๋“€์„œ ํ•จ์ˆ˜๋Š” `state(ํ˜„์žฌ ์ƒํƒœ)`์™€ `action(์•ก์…˜ ๊ฐ์ฒด)` ๋‘๊ฐ€์ง€๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ 
์ƒˆ๋กœ์šด state๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์คŒ.

์ƒํƒœ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด, store๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋˜ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ listener()๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์คŒ.
์ด์ œ ๊ตฌ๋…์ž ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ ๋จ.

๐Ÿ‘‰ react-redux hook

redux์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ.
1. getState(): ํ˜„์žฌ state๋ฅผ ๋ฐ›์Œ.
2. dispatch(): action์„ reducerํ•œํ…Œ ๋ณด๋‚ด์„œ state๋ฅผ update์‹œํ‚ด.
3. subscribe(): state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด callbackํ•จ์ˆ˜ ํ˜ธ์ถœ.

์ฆ‰, ์‹คํ–‰ ํ๋ฆ„์„ ๋ณด๋ฉด
subscribe()๋ฅผ ์ง€์ • -> dispatch()๋ฅผ ํ†ตํ•ด state ๋ณ€ํ™” -> subscribe์—์„œ 
getState()๋ฅผ ํ†ตํ•ด state๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๊ฐ’์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•จ.

์—ฌ๊ธฐ์„œ subscribe๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค์‹œ re-renderํ•˜๋Š” ์ž‘์—…์€ ๋ณต์žกํ•˜๊ณ  ํž˜๋“  ์ผ์ธ๋ฐ, 
์ด ๋ฌธ์ œ๋ฅผ react-redux hook์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ !
  • useSelector
    : redux์˜ state๊ด€๋ฆฌ๋ฅผ ๋„์™€์คŒ. react ์ปดํฌ๋„ŒํŠธ redux์˜ store ๋‚ด๋ถ€์˜ data๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค. (state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด subscribe๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์ง€๋งŒ, useSelector๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ subscribeํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Œ)

  • useDispatch
    : store.dispatch๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, useDispatch์˜ return๊ฐ’์€ store.dispatch()์ด๋‹ค.

  • Provider
    : react-redux hook์ด ์›ํ•˜๋Š” redux store์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ.
    hook์€ jsํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ €์ ˆ๋กœ store.js์—์„œ store๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.
    ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด react-reduxํ•œํ…Œ store๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด ๋•Œ provider ์‚ฌ์šฉ.


๐Ÿ’Ÿ redux ์‚ฌ์šฉ ์ด์œ  )

- state ์ข…์†์„ฑ ํƒˆํ”ผ

: useState๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— state๋ฅผ ๋งŒ๋“ค๊ณ  ํ•จ์ˆ˜๋กœ state๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ state๊ฐ€ ์ปดํฌ๋„ŒํŠธ์— ์ข…์†๋˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์ž„.
๊ทธ๋Ÿฌ๋‚˜, redux๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ๋ ˆ๋ฒจ์—์„œ store๋ผ๋Š” ๊ณณ์— state๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” store์— ๊ตฌ๋…์„ ํ•˜๋ฉด์„œ state์™€ state ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ฒŒ ๋จ. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์—์„œ ํ•จ.

- props ์ง€์˜ฅ ํƒˆ์ถœ

: ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” state๊ฐ€ ์ž์‹์˜ ์ž์‹์˜ ์ž์‹ .. ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด props๋ฅผ ๋‚ด๋ฆฌ๊ณ  ~ ๊ทธ state ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ๋˜ ๋‚ด๋ฆฌ๊ณ  ~ ๊ณ„์† ๋‚ด๋ฆผ.
redux์˜ store๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ๋ ˆ๋ฒจ์— ์œ„์น˜ํ•˜๊ณ , ํ•ด๋‹น store๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘๋Š” state์™€ state ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋А ์œ„์น˜์— ์žˆ๋“  ์ƒ๊ด€ ์—†์ด ๋‹จ ํ•œ๋ฒˆ์— ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.

๐Ÿ’Ÿ redux๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€ ๊ฒฝ์šฐ )

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ํ•„์š”ํ•œ state์˜ ์–‘์ด ๋งŽ์€ ๊ฒฝ์šฐ
  • ๊ณ„์†ํ•ด์„œ ๋ฐ”๋€Œ๋Š” ์ƒ๋‹นํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
  • state๊ฐ€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋  ๊ฒฝ์šฐ
  • ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋” ์ด์ƒ ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํฐ ๊ฒฝ์šฐ
๐Ÿ“Œ ์‚ฌ์šฉ์‚ฌ๋ก€ )

type์— ๋”ฐ๋ผ ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ณ , ๋นผ๊ณ , ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—… ์ˆ˜ํ–‰

// reducer ํ•จ์ˆ˜
const initialState = {
	value: 0
}

export default function addsubReducer(state = initialState, action) {
	switch (action.type) {
		case 'increment': {
			return {
				...state,
				value: state.value + 1
			}
		}
		case 'decrement': {
			return {
				...state,
				value: state.value - 1
			}
		}
		case 'reset': {
			return {
				...state,
				value: 0
			}
		}
		default:
			return state
	}
}


// store ์ƒ์„ฑ
import { createStore } from 'redux'
import rootReducer from './reducer'

const store = createStore(rootReducer) // redux์˜ createStore๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ

export default store


// index.js
import { Provider } from 'react-redux'
import store from './store'

ReactDOM.render(
	<React.StrictMode>
		<Provider store={store}> // Provider๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ store ์ง€์ •
			<App />
		</Provider>
	</React.StrictMode>,
	document.getElementById('root')
);


// App.js
function App() {
	const dispatch = useDispatch() 
        // store.dispatch๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” react-redux hook

	const { value } = useSelector(state => state.value)
	const { count } = useSelector(state => state.count)
        // redux์˜ state๊ด€๋ฆฌ๋ฅผ ๋„์™€์คŒ. 
        // react component์—์„œ redux์˜ store ๋‚ด๋ถ€์˜ data๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
        (subscribe()์˜ ์‚ฌ์šฉ ์—†์ด ์ž๋™์ ์œผ๋กœ subscribeํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์Œ)

	const addValue = () => {
		dispatch({ type: 'increment' })
	}
	const subValue = () => {
		dispatch({ type: 'decrement' })
	}
	const resetValue = () => {
		dispatch({ type: 'reset' })
	}
	const pushButton = () => {
		dispatch({ type: 'push' })
	}

	return (
		<div className="App">
			<div>
				value: {value}
			</div>
			<button onClick={addValue}> + </button>
			<button onClick={subValue}> - </button>
			<button onClick={resetValue}> reset </button>
			<div>
				count: {count}
			</div>
			<button onClick={pushButton}> click </button>
		</div>
	);
}






์ฐธ๊ณ  ์‚ฌ์ดํŠธ

Fragments
React Fragments ์‚ฌ์šฉ์ด์œ  ๋ฐ ์‚ฌ์šฉ๋ฒ•
[React] Fragment๋ž€?


Components์™€ Props
[React] ๋ฆฌ์•กํŠธ - props ์‚ฌ์šฉํ•˜๊ธฐ
props๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๊ฐ’ ์ „๋‹ฌํ•˜๊ธฐ
React Props, State ์ดํ•ด ๋ฐ ์‚ฌ์šฉ๋ฒ•


Redux ์‹œ์ž‘ํ•˜๊ธฐ
Redux ํ•ต์‹ฌ, Part 1: Redux Overview and Concepts
๋ฆฌ๋•์Šค
๋ฆฌ๋•์Šค(Redux)๋ฅผ ์™œ ์“ธ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋•์Šค๋ฅผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐœ์•… (i)
react-redux ์‚ฌ์šฉ๋ฒ•
[React] redux ๋ฅผ ์ด์šฉํ•œ ์˜ˆ์ œ

profile
์•„์ž์•„์ž

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