roqkf

[React] Redux ๋ณธ๋ฌธ

๐Ÿ’ป Development/React

[React] Redux

ahyeon7 2022. 12. 28. 11:06

โœจ Intro


๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ 3, ์ปดํฌ๋„ŒํŠธ 6์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค. ์ด ์ƒํƒœ๋Š” ์–ด๋А ์ปดํ“จ๋„ŒํŠธ์— ์œ„์น˜์‹œ์ผœ์•ผ ํ• ๊นŒ? ๋‹ต์€ React ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ƒํƒœ ๋ฐฐ์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ 1, 2๋Š” ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง
  • ์ƒํƒœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ, Props ๋‚ด๋ ค์ฃผ๊ธฐ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑฐ์นจ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ํ๋ฆ„๋„ ๋ณต์žกํ•ด์ง
  • ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋ณ€๋™ ์‹œ, ํ˜„์žฌ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Œ

 

[React ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„]

 

[Redux ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„]

  • ๋‘ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋น„๊ตํ•ด ๋ณด๋ฉด React๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค Redux๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋ณด๋‹ค ๊น”๋”ํ•ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Redux๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ์ธ Store์„ ์ œ๊ณตํ•˜์—ฌ Props Drilling์„ ํ•ด๊ฒฐํ•ด ์ค€๋‹ค.

โค๏ธ‍๐Ÿ”ฅ Redux

  • React ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ
  • ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์•ฑ์„ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

๐Ÿ”Ž Redux | ์„ธ ๊ฐ€์ง€ ์›์น™

1. Single source of truth

  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ๊ณณ์—์„œ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.
  • Redux์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” Store ๋‹จ ํ•˜๋‚˜๋ฟ์ธ ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋Š” ์›์น™

2. State is read-only

  • ์ƒํƒœ๋Š” ์ฝ๊ธฐ ์ „์šฉ, React์—์„œ ์ƒํƒœ๊ฐฑ์‹ ํ•จ์ˆ˜๋กœ๋งŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด Redux์˜ ์ƒํƒœ๋„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ฆ‰, React์—์„œ setState ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด Redux์—์„œ๋„ Action์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

3. Changes are made with pure functions

  • ๋ณ€๊ฒฝ์€ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ƒํƒœ๊ฐ€ ์—‰๋šฑํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ผ์ด ์—†๋„๋ก ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ๋งŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” Reducer์™€ ์—ฐ๊ฒฐ๋˜๋Š” ์›์น™
  • Store - Action - Reducer

๐Ÿ”Ž Redux | ๊ธฐ๋ณธ ์šฉ์–ด

1. Action

  • ์–ด๋–ค ์•ก์…˜์„ ์ทจํ•  ๊ฒƒ์ธ์ง€ ์ •์˜ํ•ด ๋†“์€ ๊ฐ์ฒด
  • ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ
// payload๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ
{ type: 'INCREASE' }

// payload๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
{ type: 'SET_NUMBER', payload: 5 
  • type์˜ ์ง€์ •์€ ํ•„์ˆ˜์ด๋ฉฐ Snake Case๋กœ ์ž‘์„ฑ, ํ•ด๋‹น Action ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€ ๋ช…์‹œํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • ํ•„์š”์— ๋”ฐ๋ผ payload๋ฅผ ์ž‘์„ฑํ•ด ๊ตฌ์ฒด์ ์ธ ๊ฐ’ ์ „๋‹ฌ
// payload๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ
const increase = () => {
  return {
    type: 'INCREASE'
  }
}

// payload๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
const setNumber = (num) => {
  return {
    type: 'SET_NUMBER',
    payload: num
  }
}
  • ๋ณดํ†ต Action์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ธฐ๋ณด๋‹ค Action ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ Action Creator(์•ก์…˜ ์ƒ์„ฑ์ž)๋ผ๊ณ ๋„ ํ•œ๋‹ค.

โž• payload

  • ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ, ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ์˜๋ฏธ
  • ์ฐธ๊ณ ํ•˜๊ธฐ

2. Reducer

  • Dispatch์—๊ฒŒ์„œ ์ „๋‹ฌ๋ฐ›์€ Action ๊ฐ์ฒด์˜ type ๊ฐ’์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ•จ์ˆ˜
const count = 1

// Reducer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ธ์ž๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
const counterReducer = (state = count, action) => {

  // Action ๊ฐ์ฒด์˜ type ๊ฐ’์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜๋Š” switch ์กฐ๊ฑด๋ฌธ์ž…๋‹ˆ๋‹ค.
  switch (action.type) {

    //action === 'INCREASE'์ผ ๊ฒฝ์šฐ
    case 'INCREASE':
			return state + 1

    // action === 'DECREASE'์ผ ๊ฒฝ์šฐ
    case 'DECREASE':
			return state - 1

    // action === 'SET_NUMBER'์ผ ๊ฒฝ์šฐ
    case 'SET_NUMBER':
			return action.payload

    // ํ•ด๋‹น ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์„ ๋• ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด
    default:
      return state;
	}
}
// Reducer๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ, Reducer๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค. ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด ๊ธฐ๋Œ€๊ฐ’์ด ์•„๋‹Œ ์—‰๋šฑํ•œ ๊ฐ’์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ผ์ด ์—†์–ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';
import { Provider } from 'react-redux';
import { legacy_createStore as createStore } from 'redux';

const rootElement = document.getElementById('root');
const root = createRoot(rootElement);

{
  /* 
  Reducer ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๊ธฐ์กด state๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
  ์ฒซ๋ฒˆ์งธ ์ธ์ž์— default value๋ฅผ ๊ผญ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  => ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ, undefined๊ฐ€ ํ• ๋‹น๋ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  ๋‘๋ฒˆ์งธ ์ธ์ž์—๋Š” action ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
*/
}
const count = 1;

// Reducer๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์ธ์ž๋กœ ์š”๊ตฌ
const counterReducer = (state = count, action) => {
  // Action ๊ฐ์ฒด์˜ type ๊ฐ’์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜๋Š” switch ์กฐ๊ฑด๋ฌธ
  switch (action.type) {
    //action === 'INCREASE'์ผ ๊ฒฝ์šฐ
    case 'INCREASE':
      return state + 1;

    // action === 'DECREASE'์ผ ๊ฒฝ์šฐ
    case 'DECREASE':
      return state - 1;

    // action === 'SET_NUMBER'์ผ ๊ฒฝ์šฐ
    case 'SET_NUMBER':
      return action.payload;

    // ํ•ด๋‹น ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†์„ ๋• ๊ธฐ์กด ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด
    default:
      return state;
  }
};
// Reducer๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

// conterReducer๋ฅผ createStore์— ์ „๋‹ฌ
const store = createStore(counterReducer);

root.render(
  <Provider store={store}>
    <App />
  </Provider>
);
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Reducer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Redux์˜ combineReducers ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ Reducer๋กœ ํ•ฉ์ณ์ค„ ์ˆ˜ ์žˆ๋‹ค.
import { combineReducers } from 'redux';

const rootReducer = combineReducers({
  counterReducer,
  anyReducer,
  ...
});

3. store

  • ์ƒํƒœ๊ณผ ๊ด€๋ฆฌ๋˜๋Š” ์˜ค์ง ํ•˜๋‚˜๋ฟ์ธ ์ €์žฅ์†Œ์˜ ์—ญํ• 
  • Redux ์•ฑ์˜ state๊ฐ€ ์ €์žฅ๋ผ ์žˆ๋Š” ๊ณต๊ฐ„, createStore ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด Reducer๋ฅผ ์—ฐ๊ฒฐํ•ด Store๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
import { createStore } from 'redux';
const store = createStore(rootReducer);

โž• ์ „์—ญ ๋ณ€์ˆ˜ ์ €์žฅ์†Œ ์„ค์ • ๋ฐฉ๋ฒ•

import React from 'react';
import { createRoot } from 'react-dom/client';
import App from './App';

{/*
  react-redux์—์„œ Provider ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  Provider๋Š” store๋ฅผ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
  Store๋ฅผ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ค€ ํ›„, Provider ์ปดํฌ๋„ŒํŠธ์˜ Props๋กœ store ์„ค์ •
*/}
import { Provider } from 'react-redux';

{/*
  redux์—์„œ createStore ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

*/}
import { legacy_createStore as createStore } from 'redux';

const rootElement = document.getElementById('root');
const root = createRoot(rootElement);

const reducer = () => {};

{/*
  ๋ณ€์ˆ˜ store์— createStore ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด store ๋งŒ๋“ค์–ด ์ฃผ๊ณ  createStore์˜ ์ธ์ž๋กœ reducer ํ•จ์ˆ˜ ์ „๋‹ฌ
*/}
const store = createStore(reducer);

root.render(
  {/*
    ์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ store ์‚ฌ์šฉ์„ ์œ„ํ•ด App ์ปดํฌ๋„ŒํŠธ๋ฅผ Provider๋กœ ๊ฐ์‹ผ ํ›„, Props๋กœ ๋ณ€์ˆ˜ store ์ „๋‹ฌ
  */}
  <Provider store={store}>
    <App />
  </Provider>
);

๐Ÿ”Ž Dispatch

  • Reducer๋กœ Action์„ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
  • Duspatch์˜ ์ „๋‹ฌ์ธ์ž๋กœ Action ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ
  • Action ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์€ Dispatch ํ•จ์ˆ˜๋Š” Reducer๋ฅผ ํ˜ธ์ถœ
// Action ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ
dispatch( { type: 'INCREASE' } );
dispatch( { type: 'SET_NUMBER', payload: 5 } );

// ์•ก์…˜ ์ƒ์„ฑ์ž(Action Creator)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
dispatch( increase() );
dispatch( setNumber(5) );

๐Ÿ”Ž Redux Hooks

  • React-Redux์—์„œ Redux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Hooks ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณต
  1. useDispatch()
  • Action ๊ฐ์ฒด๋ฅผ Reducer๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋Š” Dispatch ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
import { useDispatch } from 'react-redux'

const dispatch = useDispatch()
dispatch( increase() )
console.log(counter) // 2

dispatch( setNumber(5) )
console.log(counter) // 5

[useDispatch ์‹ค์Šต]

import React from 'react';
import './style.css';
// react-redux์—์„œ useDispatch ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import { useDispatch } from 'react-redux';
// Action Creater ํ•จ์ˆ˜ increase, decrease ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import { increase, decrease } from './index.js';

export default function App() {
  // useDispatch์˜ ์‹คํ–‰ ๊ฐ’๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์„œ dispatch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ
  const dispatch = useDispatch();
  console.log(dispatch);

  const plusNum = () => {
    // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ dispatch๋ฅผ ํ†ตํ•ด action ๊ฐ์ฒด๋ฅผ Reducer ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
    dispatch(increase());
  };

  const minusNum = () => {
    // ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ dispatch๋ฅผ ํ†ตํ•ด action ๊ฐ์ฒด๋ฅผ Reducer ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
    dispatch(decrease());
  };

  return (
    <div className="container">
      <h1>{`Count: ${1}`}</h1>
      <div>
        <button className="plusBtn" onClick={plusNum}>
          +
        </button>
        <button className="minusBtn" onClick={minusNum}>
          -
        </button>
      </div>
    </div>
  );
}
  1. useSelector()
  • ์ปดํฌ๋„ŒํŠธ์™€ state๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ Redux์˜ state์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ
// Redux Hooks ๋ฉ”์„œ๋“œ๋Š” 'redux'๊ฐ€ ์•„๋‹ˆ๋ผ 'react-redux'์—์„œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
import { useSelector } from 'react-redux'
const counter = useSelector(state => state)
console.log(counter) // 1

[useSelector ์‹ค์Šต]

import React from 'react';
import './style.css';
// react-redux์—์„œ useDispatch, useSeletor ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
import { useDispatch, useSelector } from 'react-redux';
import { increase, decrease } from './index.js';

export default function App() {
  const dispatch = useDispatch();
  {
    /* useSelector์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž์— Store์— ์ €์žฅ๋œ ๋ชจ๋“  state๊ฐ€
   ๋‹ด๊ธด๋‹ค. ๊ทธ๋Œ€๋กœ return์„ ํ•˜๊ฒŒ ๋˜๋ฉด Store์— ์ €์žฅ๋œ ๋ชจ๋“  state๋ฅผ
   ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. */
  }
  const state = useSelector((state) => state);

  {
    /* ๋ณ€์ˆ˜ state๋ฅผ ์ฝ˜์†”์—์„œ ํ™•์ธ, Store์— ์ €์žฅ๋œ ๊ธฐ์กด state ๊ฐ’์ธ
   1์ด ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. */
  }
  console.log(state);

  const plusNum = () => {
    dispatch(increase());
  };

  const minusNum = () => {
    dispatch(decrease());
  };

  return (
    <div className="container">
      {/*  Store์—์„œ ๊บผ๋‚ด์˜จ state๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜ state๋ฅผ ํ™œ์šฉ */}
      <h1>{`Count: ${state}`}</h1>
      <div>
        <button className="plusBtn" onClick={plusNum}>
          +
        </button>
        <button className="minusBtn" onClick={minusNum}>
          -
        </button>
      </div>
    </div>
  );
}

// +, - ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค state๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

'๐Ÿ’ป Development > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] React Diffing Algorithm  (0) 2023.03.01
[React] Virtual DOM  (0) 2023.03.01
[React] Props Drilling  (0) 2022.12.27
[React] Cmarket Hooks  (0) 2022.12.27
[React] ์ƒํƒœ๊ด€๋ฆฌ  (0) 2022.12.27