Redux 실습

Taehye.on·2023년 4월 25일
0

코드스테이츠 44기

목록 보기
62/89
post-thumbnail

D-48

🔍 Redux 실습

아래 다섯가지를 구현하는 실습을 진행해보자.

  1. Store
  2. Reducer
  3. Action
  4. useDispatch
  5. useSelector

🔍 index.js

import React from 'react';
import { createRoot } from 'react-dom/client';
import { Provider } from 'react-redux';
import { legacy_createStore as createStore } from 'redux';
import App from './App';

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

//2. action은 어떤 액션을 취할것인지 정의해놓은 객체다.
// type은 여기서 필수로 지정을 해주어야 하고 대문자로 작성한다.
// 구체적인 값을 전달할 경우 payload 작성한다.
// action을 직접 작성하기 보다는 action 객체를 생성하는 함수인 액션 생성자를 만든다.

// payload가 필요없을 경우
export const increase = () => {
  return {
    type: 'INCREASE',
  };
};

export const decrease = () => {
  return {
    type: 'DECREASE',
  };
};

// payload가 필요할 경우
const setNumber = (num) => {
  return {
    type: 'SET_NUMBER',
    payload: num,
  };
};

//1. reducer는 dispatch에게 전달받은 action 객체의 type에 따라 상태를 변경시킨다.
const count = 1;
//reducer를 생성할때는 초기상태를 인자로 요구한다.
const reducer = (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가 리턴하는 값이 새로운 상태가 된다

// 0. store는 상태가 관리되는 하나뿐인 저장소다.
const store = createStore(reducer);

root.render(
  <Provider store={store}>
    <App />
  </Provider>
);

🔍 App.js

import React from 'react';
import './style.css';
import { useSelector, useDispatch } from 'react-redux';
import { increase, decrease } from './index.js';

export default function App() {
  //3. dispatch는 reducer로 action을 전달해주는 함수다.
  // dispatch의 전달인자로 action 객체가 전달된다.
  const dispatch = useDispatch()

   //4. useSelector()는 컴포넌트와 state를 연결하여 redux의 state에 접근할 수 있게 하는 메서드다.
  const counter = useSelector(state => state)

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

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

  return (
    <div className="container">
      <h1>{`Count: ${counter}`}</h1>
      <div>
        <button className="plusBtn" onClick={plusNum}>
          +
        </button>
        <button className="minusBtn" onClick={minusNum}>
          -
        </button>
      </div>
    </div>
  );
}

❓ Error

App.js를 작성하던 중 아래와 같은 에러가 도출되었다.
src/App.js에 종료되지 않은 문자열 리터럴이 있다는 에러다.

import React from 'react';
import './style.css';
import { useSelector, useDispatch } from 'react-redux';
import { increase, decrease } from './index.js;

import 마지막 두줄에 적용되어있던 주석을 제거할 때 작은 따옴표도 같이 지워지면서
SyntaxError가 발생했던 것..! 😱 조심해야겠다.


🔍 결과


+ 버튼과 -버튼 둘 다 작동이 잘 된다.


Redux 데이터 흐름 순서를 살펴보면 다음과 같다.

  1. 상태가 변경되는 이벤트가 발생하면 변경될 상태에 대한 정보가 담긴 Action 객체가 생성된다.
  2. 이 Action 객체는 Dispatch 함수의 인자로 전달된다.
  3. Dispatch 함수는 Action 객체를 Reducer 함수로 전달해준다.
  4. Reducer 함수는 Action 객체의 값을 확인하고 그 값에 따라 전역 상태 저장소 Store의 상태를 변경한다.
  5. 상태가 변경되면 React는 화면을 다시 렌더링 한다.

Redux에서는 Action → Dispatch → Reducer → Store 순서로 단방향으로 데이터가 흐른다.

0개의 댓글