Redux

[Redux] redux(리덕스) 사용하기

s._.young01 2023. 1. 26. 17:50
728x90
반응형

redux(리덕스) : Javascript앱을 위한 예측 가능한 상태 컨테이너

 

useState (): 간단한 상태의 업데이트
useReducer() : 여러 개의 상태를 dispatch를 통해 업데이트
이때 redux는 리액트의 useReducer()를 잘 이해하고 있으면 좋다 !

 

redux의 3가지 규칙

  1. 하나의 애플리케이션 안에는 하나의 스토어가 있다.
  2. 상태는 읽기전용이다.
  3. reducer는 순수한 함수여야 한다.

 

▶ Javascript에서 redux 사용하기

1) 아래의 URL주소로 들어간다. 

https://cdnjs.com/libraries/redux

2) 페이지에 보이는 주소 두 개 중 아무 주소를 복사한 후,  HTML <head>태그 안에 

<script src='복사한 주소를 붙여넣기'></script>

 

 

▶ React에서 redux 사용하기

1) 터미널 열어 패키지 설치하기 !

☞ npm install redux , npm install react-redux (두 개 다 설치!)

2) package.json 파일에 들어가 잘 설치되었는지 확인한다.

 

 

▶ redux의 장점

  1. 상태를 예측 가능하게 만든다.
  2. 유지 / 보수에 용이하다.
  3. 디버깅에 유리하다. (redux dev tools : 크롬 확장 프로그램)

 


 

기본 Redux의 상태 관리하기 

 

1. Store(스토어) 생성하기 : store에는 현재 상태(state), reducer함수, 내장함수들이 있다.

 

↓ store의 내장함수들 

더보기

dispatch(), subscribe(), getState() 가 있다.

 

기본 구문 > 

const store = Redux.createStore(reducer함수);

 

2. 상태 값 반환하기 : redux에서 state는 그냥 불러올 수 없고, store의 내장함수인 getState()를 호출 시 상태 값을 불러올 수 있다.

 

기본 구문 >

store.getState();

 

 

3. 상태 값 변경하기 : dispatch()호출 시 reducer()함수가 호출됨

 

기본 구문 >

store.dispatch({
	type: 'hahaha'
});

 

 

4. 구독하기 : store의 내장함수인 subscribe(함수명)로 상태가 업데이트 될 때마다 전달해준 특정 함수가 호출하게 만든다.

 

기본 구문 >

store.subscribe(함수명);

 

 

javascript에서 redux 사용하기 실습 >

 

1) redux 사용 X

 

 

2) redux 사용 O

 

 

 


 

React에서 Redux Module 생성 & 상태 관리하기

 

 

리액트에서 리덕스를 사용할 때 순서 : 리덕스 모듈 생성 → 루트 리듀서 생성 → 스토어 생성 & 스토어 전역에 사용 → Hook함수 작성

 

1. redux module(리덕스 모듈) : action타입, action 생성 함수, reducer 함수가 모두 포함되어 있는 js파일

 

1) action 타입 : action객체의 type 값을 변수에 담아서 그 변수를 reducer함수의 action객체의 type 값에다 지정(오타 줄이기)

2) action 생성 함수 : action객체를 함수에 담아서 사용하기 위함 (필수 작성은 아님 !)

3) reducer 함수 : 상태를 업데이트 해주는 함수, 두 개의 파라미터를 받아옴 ☞ state(상태), action객체

 

 

 

2. rootReducer(루트 리듀서) : 한 프로젝트에 여러 개의 reducer가 있을 경우, 한 reducer로 합쳐서 사용하는데,

그 합쳐진 reducer를 rootReducer라 함.

 

rootReducer 사용 방법 >

// 무조건 자동완성 !!!!!
import { combineReducers } from "redux";
import 모듈1 from "./module1";
import 모듈2 from "./module2";

// combineReducers({모듈이름: 모듈이름}) : 
const rootReducer = combineReducers({
    모듈1: 모듈1,
    모듈2: 모듈2
    // key와 value의 이름이 같으므로 
    // 모듈1,
    // 모듈2
    // 이렇게 적어도 된다 !
});

// 내보내기 해야 어디든지 사용 가능한 모듈이 된다! 
export default rootReducer;

 

3. store(스토어) 생성하기 &  store(스토어) 전역에 사용하기

1) src폴더에 있는 index.js파일에 들어간다.

2) legacy_createStore 자동완성 입력 후 import된 구문에 as createStore 적기

3) legacy_createStore를 지우고 그 자리에 스토어를 생성한 후 rootReducer함수를 호출한다.

roodReducer가 자동완성이 안되면 꼭 import로 불러와야 한다!

4) root.render() 함수에 App 컴포넌트를 Provider로 감싸준다. (자동완성 해서 import 꼭 하자)

생성한 store를 어디서나 쓸 수 있다

 

 

4. 컴포넌트 생성하기 & Hook함수 사용하기

1) 컴포넌트 생성하기 

  1. 프레젠테이셔널 컴포넌트 : 리덕스 스토어에 직접 접근하지 않고 필요한 값을 컨테이너 컴포넌트에서 props로 받아와 화면에 보여주는 컴포넌트
  2. 컨테이너 컴포넌트 : 리덕스 스토어에 직접 접근해 상태를 조회, action을 dispatch할 수 있는 기능을 담은 컴포넌트 (다른 프레젠테이셔널 컴포넌트를 불러와 사용한다.)  = useSelector와 useDispatch를 실행

 

2) Hook함수 사용하기

 

- useSelector(콜백함수) : 리덕스 스토어의 state를 조회하는 함수

// 1. 기본 모든 상태 조회하기
const number = useSelector(state => state);
// 2. 상태의 특정 값 조회하고 싶을 때
const number = useSelector(state => state.number);
// action객체의 특정 key값으로 접근해 상태를 조회한다 !

- useDispatch() : 상태 업데이트를 요청할 dispatch함수를 반환

→ dispatch 호출 action이 발생 reducer함수가 호출 상태 업데이트

const dispatch = useDispatch();
// 리덕스 모듈파일에 있는 각각의 action들을 dispatch해주는 함수 생성
const onAdd = () => dispatch({액션 객체}); // 1번
const onAdd = () => dispatch(액션 생성 함수명()); // 2번

 

 


 

 

Redux DevTools : 애플리케이션 상태가 언제, 어디서, 어떻게 변경되었는지 쉽게 추적 할 수 있다.

 

1. 크롬 확장 프로그램 설치

https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd

 

Redux DevTools

Redux DevTools for debugging application's state changes.

chrome.google.com

 

 

2. 사용하기

 

1) 생성한 스토어에 아래처럼 복사해서 붙여넣기 ☞ 자바스크립트에서 리덕스 사용할 때

→ Redux.createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__())

 

2) 터미널에 패키지 설치하기 ☞ 리액트에서 리덕스 사용할 때

→ npm install --save @redux-devtools/extension

→ index.js파일의 스토어 생성에 아래처럼 적기 

// 얘도 자동완성 !!!!!
const store = createStore(rootReducer, devToolsEnhancer());

 

 

3. 개발자 도구를 열어 Redux가 생겼는지 확인 (안 보인다면 터미널 열어 npm start 다시 해주자)

728x90