FE RYAN
완벽하지 않으면 어때
FE RYAN
전체 방문자
오늘
어제

블로그 메뉴

  • 💾 깃허브 링크
  • 홈
  • 태그
  • 분류 전체보기 (151)
    • 개인프로젝트 (8)
      • 개인 포트폴리오 웹앱 (6)
      • 프론트엔드 기술면접 아카이빙 웹앱 (2)
    • 기록 (121)
      • 원티드 프리온보딩 인턴십 (0)
      • 코드스테이츠 프론트엔드 (75)
      • 생각들 (3)
      • Today I learned (32)
      • 회고 (9)
      • 리뷰 (1)
    • 개발 (17)
      • React (3)
      • Javascript (7)
      • CSS (1)
      • HTML (3)
      • HTTP (1)
      • 자료구조 (0)
      • 알고리즘 (2)
    • 코딩테스트 (2)
      • 백준 (2)
      • 프로그래머스 (0)
    • 디자인 (1)
      • UI & UX (1)
    • 수학 (0)
    • 자기계발 (0)

공지사항

인기 글

태그

  • 부트캠프
  • 자바스크립트
  • 딥다이브
  • 원시타입
  • seb39
  • seb 39
  • 회고
  • css
  • 프론트엔드
  • 코드스테이츠
  • 타입스크립트
  • 리액트
  • 신입개발자
  • HTML
  • 포트폴리오
  • useMemo
  • ES6
  • 메인프로젝트
  • 자바스크립트 딥다이브
  • Til

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
FE RYAN
기록/코드스테이츠 프론트엔드

11주 3일차 - Cmarket Redux 1

기록/코드스테이츠 프론트엔드

11주 3일차 - Cmarket Redux 1

2022. 7. 6. 23:49
728x90

11주 3일차 - Cmarket Redux 1

1. 배운 것

2. 내용 정리

Redux 사용시 리액트 앱 파일 구조

  • src > store > index.js
    • src 폴더의 하위 폴더로 리덕스 관련 코드 파일을 저장할 store 폴더를 생성하고 index.js 파일을 생성하여 리덕스 관련 로직들을 관리한다.
    • index.js에서 store 생성, reducer 함수 정의. (참고 강의와 다르게 과제 코드는 reducer와 store 별도 폴더로 분리됨. 미들웨어 사용 때문인지?)

Store 제공하기

  • src > index.js
    • render함수 안에서 App 컴포넌트를 Provider 컴포넌트로 감싼다. (전역 상태를 관리하기 위해 App 컴포넌트를 감싼다.)
    • 이 때 Provider 컴포넌트의 속성으로 반드시 store를 제공해야 한다.
// src > index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux'; // 추가
import { store } from './store/index'; // 추가

import './index.css';
import App from './App';

// * Provider 컴포넌트를 store 속성과 함께 사용
ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

컴포넌트에서 리덕스 데이터 사용하기

  • src > components > Counter.js
    • react-redux 라이브러리의 useSelector Hook을 import.
    • 컴포넌트 내 리턴문 상단에서 useSelctor 훅의 인수로 리덕스가 관리하는 상태에서 추출한 값을 받는다.
// src > components > Counter.js

import { useSelector } from 'react-redux'; // 추가
import classes from './Counter.module.css';

const Counter = () => {
  // When using useSelector,
  // React-Redux will automatically set up a subscription
  // useSelector 를 사용하여 redux store에서 상태가 바뀔 때마다,
  // 가장 최신의 state.counter 값을 받는다.
  const counter = useSelector(state => state.counter);
  const toggleCounterHandler = () => {};

  return (
    <main className={classes.counter}>
      <h1>Redux Counter</h1>
      <div className={classes.value}>
				**{counter}**
			</div>
      <button onClick={toggleCounterHandler}>Toggle Counter</button>
    </main>
  );
};

export default Counter;

Reducer 함수 정의하기

  • src > store > index.js
// src > store > index.js
// src 폴더의 하위 폴더로 리덕스 관련 코드 파일을 저장할 store 폴더를 생성하고 index.js 파일을 생성하여 리덕스 관련 로직들을 관리한다.

import { createStore } from 'redux';

function counterReducer(state = { counter: 0 }, action) {
  switch (action.type) {
    case '증가':
      return {
        counter: state.counter + 1,
      };

    case '감소':
      return {
        counter: state.counter - 1,
      };

    default:
      return state; // { counter: 0 }
  }
}

const store = createStore(counterReducer);

export default store;

내부 컴포넌트에서 action을 Dispatch 하기

src > store > index.js 에서 정의한 reducer 함수의 identifier와 동일한 type의 값을 dispatch 해주어야 함.

Payload 보내기

reducer 함수에서 모든 action.type의 값 마다 조건 분기를 일일이 하드코딩하는건 scalable 하지 않다.

실제 프로그램이라면 유저의 입력값에 따라 state가 변경되어야 하므로 하드코딩으로 대응할 수 없음.

따라서 reducer 함수 내에서 action.프로퍼티명 으로 dispatch 함수가 전달한 action 객체의 해당 프로퍼티의 값에 따라 유동적으로 state를 변경 가능.

**// src > store > index.js**

function counterReducer(state = { counter: 0 }, action) {
  switch (action.type) {
    case '증가':
      return {
        counter: state.counter + 1,
      };

    **case '가변적인증가':
      return {
        counter: state.counter + action.amount,
      };**

    case '감소':
      return {
        counter: state.counter - 1,
      };

    default:
      return state; // { counter: 0 }
  }
}
**// src > components > Counter.js**

const increaseHandler = () => {
    // 실제 프로그램이라면 유저의 인풋값을 받아오겠지만,
    // 연습예제이므로 우선 amount: 5 로 payload 하드코딩.
    dispatch({ type: '가변적인증가', amount: 5 });
  };

Cmarket Redux 과제 정리

내일 포스팅할래….

더 공부할 내용

3. 리뷰

39기에서 마음속으로 롤모델 삼던 분들 중 한 분과 페어로 이번 과제를 진행할 수 있어 좋았다.

728x90
저작자표시 비영리 변경금지 (새창열림)

'기록 > 코드스테이츠 프론트엔드' 카테고리의 다른 글

11주차 토요일  (0) 2022.07.09
11주 4일차 - Cmarket Redux 2  (0) 2022.07.08
11주 1일차 - react custom components 리팩토링, BFS  (0) 2022.07.04
10주차 일요일 - Flex 복습, 과제 리팩토링  (0) 2022.07.03
10주차 토요일 - 과제 리팩토링, new Map();  (0) 2022.07.03
  • 1. 배운 것
  • 2. 내용 정리
  • Redux 사용시 리액트 앱 파일 구조
  • Store 제공하기
  • 컴포넌트에서 리덕스 데이터 사용하기
  • Reducer 함수 정의하기
  • 내부 컴포넌트에서 action을 Dispatch 하기
  • Payload 보내기
  • Cmarket Redux 과제 정리
  • 더 공부할 내용
  • 3. 리뷰
'기록/코드스테이츠 프론트엔드' 카테고리의 다른 글
  • 11주차 토요일
  • 11주 4일차 - Cmarket Redux 2
  • 11주 1일차 - react custom components 리팩토링, BFS
  • 10주차 일요일 - Flex 복습, 과제 리팩토링
FE RYAN
FE RYAN

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.