๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] props ๋Œ€์‹  redux ์‚ฌ์šฉํ•ด๋ณด๊ธฐ_2

by Connecting-the-dots 2022. 3. 28.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์˜ค๋Š˜์€ redux ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
  • ๋‹ค๋งŒ ์ง€๊ธˆ์€ reducer() ์— 0๋ฒˆ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” 1๋ฒˆ ์ƒํ’ˆ๋งŒ + ๋ฒ„ํŠผ๊ณผ - ๋ฒ„ํŠผ์œผ๋กœ ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ํ•ด๋‘์–ด์„œ ๋‹ค๋ฅธ ์ƒํ’ˆ๋“ค์€ ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์„ ์ˆ˜๋Š” ์—†์„๊นŒ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์•˜์ง€๋งŒ ์•„์ง redux ์— ๋Œ€ํ•œ ๊ณต๋ถ€๊ฐ€ ๋ถ€์กฑํ•ด์„œ์ธ์ง€ ๋ง˜์ฒ˜๋Ÿผ ๋˜์ง€๋Š” ์•Š์•˜๋‹ค.
  • ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์šฐ๋ฉด์„œ ๊ตฌ๊ธ€๋งํ•ด๋ณด๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ํ•ด๋ด์•ผ๊ฒ ๋‹ค. 

๐Ÿ’œ redux ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

  • reducer ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.
  • ์›ํ•˜๋Š” ์œ„์น˜์—์„œ dispatch() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ reducer ์— ์ˆ˜์ •ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•œ๋‹ค. 

๐Ÿ’œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ’ˆ๋ชฉ ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

  • ์ˆ˜๋Ÿ‰ ์—ด์— ํ•ด๋‹นํ•˜๋Š” ํ–‰๋งˆ๋‹ค + / - ๋ฒ„ํŠผ์„ ํ•˜๋‚˜์”ฉ ๋งŒ๋“ค์–ด์„œ ๊ฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์ด 1์”ฉ ์ฆ๊ฐ€ ํ˜น์€ ๊ฐ์†Œํ•˜๋„๋ก ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

๐Ÿค ์ˆ˜๋Ÿ‰ ์กฐ์ ˆ ๋ฒ„ํŠผ UI ๋งŒ๋“ค๊ธฐ

let ChangeNum = styled.button`
    border: 1px solid lightgrey;
    border-radius : 5px;
    margin: 0 15px;
    width: 25px;
`
  • button ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด์„œ css ๋กœ ๊พธ๋ฏธ๋Š” ๊ฒƒ๋ณด๋‹ค styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””์ž์ธํ•˜๋Š” ๊ฒŒ ํŽธํ•ด์„œ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ChangeNum ์ด๋ผ๋Š” Component ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

 

<td>
    <ChangeNum>+</ChangeNum>
        {item.quan}
    <ChangeNum>-</ChangeNum>
</td>
  • + ๋ฒ„ํŠผ๊ณผ - ๋ฒ„ํŠผ์€ ๋™์ผํ•œ ๋””์ž์ธ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋‘˜ ๋‹ค <ChangeNum></ChangeNum> ์œผ๋กœ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค.

๐Ÿค reducer ์…‹ํŒ…ํ•˜๊ธฐ

// ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

function reducer(){
  return [
    { id : 1, name : 'Red Knit', quan : 2 },
    { id : 0, name : 'White and Black', quan : 1 },
    { id : 3, name : 'Flowey', quan : 3 }  
  ]
}

let store = createStore(reducer);
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ reducer ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค.
  • reducer ๋Š” state ์ดˆ๊ธฐ๊ฐ’๊ณผ state ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ•์ด ๋“ค์–ด์žˆ๋Š” ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด์— createStore() ์•ˆ์— ๋“ค์–ด์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ reducer() ๋กœ ์˜ฎ๊ฒจ์„œ return ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ๋ฐ, ๋ณ„ ๊ธฐ๋Šฅ์€ ์—†์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์…‹ํŒ…์™„๋ฃŒ์ด๋‹ค.

 

// ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•

let defaultState = [
  { id : 1, name : 'Red Knit', quan : 2 },
  { id : 0, name : 'White and Black', quan : 1 },
  { id : 3, name : 'Flowey', quan : 3 }  
];

function reducer(state = defaultState, action){
  return state
}

let store = createStore(reducer);
  • ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋”ฐ๋กœ defaultState ์™€ ๊ฐ™์ด state ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค€ ๋‹ค์Œ, ๊ทธ๊ฑธ reducer() ์— default ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฌธ๋ฒ•์œผ๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ฐธ๊ณ ๋กœ default ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฌธ๋ฒ•์ด๋ž€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ, ์‹ค์ˆ˜ ํ˜น์€ ์˜๋„์ ์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ž…๋ ฅ์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ€์งˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํŒŒ๋ผ๋ฏธํ„ฐ ์„ ์–ธํ•  ๋•Œ ๋“ฑํ˜ธ(=)์™€ ํ•จ๊ป˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿค reducer ์—  ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ• ์ •์˜ํ•˜๊ธฐ

let defaultState = [
  { id : 1, name : 'Red Knit', quan : 2 },
  { id : 0, name : 'White and Black', quan : 1 },
  { id : 3, name : 'Flowey', quan : 3 }  
];

function reducer(state = defaultState, action){
  if (action.type === 'plus') {
  	return (๊ธฐ์กด ๊ฐ’์— +1 ๋œ ์ƒˆ๋กœ์šด state);
  } else if (action.type === 'minus') {
  	return (๊ธฐ์กด ๊ฐ’์— -1 ๋œ ์ƒˆ๋กœ์šด state);  
  } else {
    return state;
  }
}

let store = createStore(reducer);
  • reducer ์— ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ•์„ ์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•ด๋ณด์•˜๋‹ค.
    • ๋จผ์ €, plus ๋ผ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ• ์ด๋ฆ„์„ ํ•˜๋‚˜ ์ง€์–ด์ค€๋‹ค.
      (์ด๋Š” ๋‚˜์ค‘์— action.type === ์ˆ˜์ •๋ฐฉ๋ฒ•_์ด๋ฆ„ ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋‚˜์˜ ๊ฒฝ์šฐ 'plus', 'minus' ๋กœ ์ด 2๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. )
    • if ๋ฌธ ์•ˆ์—๋Š” 'plus' ๋ผ๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค state ๋ฅผ return ํ• ์ง€, 'minus' ๋ผ๋Š” ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค state ๋ฅผ return ํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์™ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋Š” ์–ด๋–ค state ๋ฅผ return ํ• ์ง€ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

<td>
    <ChangeNum onClick={ ()=>{ props.dispatch({ type : 'plus' }) } }>+</ChangeNum>
        {item.quan}
    <ChangeNum onClick={ ()=>{ props.dispatch({ type : 'minus' }) } }>-</ChangeNum>
</td>
  • ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ•์„ ์ •์˜ํ–ˆ๋‹ค๋ฉด ์ด์ œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํŠน์ • ๋ฐ์ดํ„ฐ ์ˆ˜์ •๋ฐฉ๋ฒ•์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก onClick ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ์ด ๋•Œ dispatch() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ html ์•ˆ์—์„œ reducer() ๋ฅผ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด + ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋Š” plus ๋ผ๋Š” state ์ˆ˜์ •๋ฐฉ๋ฒ•์ด ๋™์ž‘ํ•˜๊ณ , - ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋Š” minus ๋ผ๋Š” state ์ˆ˜์ •๋ฐฉ๋ฒ•์ด ๋™์ž‘ํ•œ๋‹ค.

๐Ÿค reducer ์ฝ”๋“œ ์™„์„ฑํ•˜๊ธฐ

let defaultState = [
  { id : 1, name : 'Red Knit', quan : 2 },
  { id : 0, name : 'White and Black', quan : 1 },
  { id : 3, name : 'Flowey', quan : 3 }  
];

function reducer(state = defaultState, action){

  if (action.type === 'plus') {
      let newState = [...state];
      newState[0].quan++;
      return newState;
      
  } else if (action.type === 'minus') {
      if (newState[0].quan > 0) {
        newState[0].quan--;
      }
      return newState;
      
  } else {
    return state;
  }
  
}

let store = createStore(reducer);
  • ์šฐ์„ , ์ฒซ๋ฒˆ์งธ ํ’ˆ๋ชฉ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ง ์ˆ˜์ •์ด ๋˜๋„๋ก ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
  • array ์ž๋ฃŒํ˜•์ด๋‚˜ object ์ž๋ฃŒํ˜•์˜ state ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•œ ์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค.
  • ๋”ฐ๋ผ์„œ, action.type ์ด plus ์ธ ๊ฒฝ์šฐ์— state ์˜ ์‚ฌ๋ณธ์ธ newState ๋ฅผ ๋งŒ๋“  ํ›„์— newState ์˜ ์ฒซ๋ฒˆ์งธ ํ’ˆ๋ชฉ์ธ 0๋ฒˆ ์ธ๋ฑ์Šค์˜ ์ˆ˜๋Ÿ‰์ธ quan ์„ +1 ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ์ˆ˜์ •์‚ฌํ•ญ์ด ๋ฐ˜์˜๋œ newState ๋ฅผ return ํ•ด์ฃผ์—ˆ๋‹ค.
  • action.type ์ด minus ์ธ ๊ฒฝ์šฐ์—๋„, action.type ์ด plus ์ธ ๊ฒฝ์šฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ๋‹ค๋งŒ, ์—ฐ์†ํ•˜์—ฌ - ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ˆซ์ž๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜๋ฏ€๋กœ ์ˆซ์ž๊ฐ€ 0 ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋งŒ -1 ์„ ํ•ด์ฃผ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•