[React] redux

이용만·2023년 9월 7일
0
  • redux : 리덕스 관련 코드를 모두 몰아 넣음
  • config : 리덕스 설정 관련 파일 전부
  • configStore : 중앙 state 관리소 -> 설정 코드(.js)
  • modules : state의 그룹! Todolist. todo.js

1) dispatch가 action 객체를 store에 던진다.
2) store는 action 객체 타입에 따라 state를 변경해주는 작업을 한다.


APP.js

import React, {  useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { plusN, minusN } from './redux/modules/counter';

const App = () => {

  const [num, setNum] = useState(0);

  //여기에서 store에 접근하여, counter의 값을 읽어오고 싶다.
  //useSelector
  const counter = useSelector((state) => {
    return state.counter;
  });

  //dispatch를 가져오는데, useDispatch의 목적은 store에 던지기 위함.
  const dispatch = useDispatch();

  const plusButton = () => {
    // dispatch(plusOne());
    dispatch(plusN(num));
  }

  const minusButton = () => {
    // dispatch(minusOne());
    dispatch(minusN(num));
  }

  return (
    <>
      <div>
        현재 카운트 : {counter.number}
      </div>
      <div>
        <input type='number' value={num} onChange={(e) => {
          setNum(+e.target.value);
        }} />
      </div>
      <button onClick={plusButton}> + </button>
      <button onClick={minusButton}> - </button>
    </>
  )
}

export default App

counter.js

//action value
const PLUS_ONE = "PLUS_ONE";
const MINUS_ONE = "MINUS_ONE";
const PLUS_N = "PLUS_N";
const MINUS_N = "MINUS_N";

//action creator : action value를 return 하는 함수
export const plusOne = () => {
  return {
    type: PLUS_ONE,
  }
}

export const minusOne = () => {
  return {
    type: MINUS_ONE,
  }
}

export const plusN = (payload) => {
  return {
    type: PLUS_N,
    payload: payload,   
  };
};

export const minusN = (payload) => {
  return {
    type: MINUS_N,
    payload: payload,
  };
};

//초기상태값(state)
const initialState = {
  number: 0
};

// 리듀서(reduce) : 'state에 변화를 일으키는' 함수, 상태 제어
// (1) state를 action의 type에 따라 변경하는 함수

//input(인자) : state와 Action 두가지의 값만 받는다.
//action : action객체는 action type을 payload 만큼 처리
//ex : payload가 3이라면 3만큼 plus 또는 minus를 한다.

const counter = (state = initialState, action) => {
  switch (action.type) {
    case PLUS_ONE:
      return {
        number: state.number + 1,
      }
    case MINUS_ONE:
      return {
        number: state.number - 1,
      }
    case PLUS_N:
      return {
        number: state.number + action.payload,
      }
    case MINUS_N:
      return {
        number: state.number - action.payload,
      }
    default:
      return state;
  }
}


export default counter;


configStore.js

// 중앙 데이터 관리소(store)를 설정하는 부분
import {createStore} from "redux";
import { combineReducers } from "redux";
import counter from "../modules/counter";
import users from "../modules/users";

const rootReducer = combineReducers({
  //리듀서들이 이곳에 들어간다.
  counter,
  users,
});

const store = createStore(rootReducer);

export default store;
profile
성장하는 개발자가 되고자 합니다.

0개의 댓글