티스토리 뷰
목차
구성이 react의 reducer랑 비슷하다
어차피 react에서 redux 쓸려면 hook도 다루고 있을 테니
reducer를 배우고 redux를 배우면 좀 익숙할 거다
Redux란
쉽게 말해서 파일을 구분 짓지 않는 데이터 저장소를 만들고, 관리하는 기술이다.
기존의 프로그램 구성이
MVC 방식인데,
자료화면은 코드의 덩치가 커질수록,
데이터를 주고받는 구조가 복잡해진다는 것이다.
예로 들어,
다음 메인 페이지를 활용할 때,
메일이 왔는지, 블로그 새 글 알람이 있는지,
카카오 지갑에 얼마 있는지 등등 데이터가 여러 가지인데
이 모든 게 Redux와 같은 체제를 쓰지 않으면 죄다 각자 불러와야 한다.
반면에 리덕스의 시초가 된 Flux 구조는 (영감을 받고 만들었다 한다)
Store에 해당 데이터를 다 저장하며,
Dispatcher를 통하여 데이터를 갱신하는 방식으로
데이터를 한 군데에서 관리할 수 있다.
설치
React 프로젝트를 만들자
npx create-react-app (프로젝트_이름)
이제 리덕스 설치를 위해
터미널에 해당 명령어를 입력해주자.
npm install redux
yarn add redux
코드
... 오늘은 VanillaJs에서 Redux를 쓸 건데
html에서 js를 script 해서 불러올 시 import에서 문제가 생기기 때문에
React 프로젝트에서 만들었다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>React App</title>
</head>
<body>
<span></span>
<button id="plus">plus</button>
</body>
</html>
bodybody에 출력용 span과 제어용 button을 추가하였다
import { createStore } from "redux";
const btnAdd = document.getElementById("plus");
const span = document.querySelector("span");
const PLUS = "PLUS";
function Store (number = 0, action) {
switch(action.type){
case PLUS:
return number +1;
default:
return number;
}
}
const countStore = createStore(Store);
function onChange(){
span.innerText = countStore.getState();
}
countStore.subscribe(onChange);
function handleClick(){
countStore.dispatch({type: PLUS});
}
btnAdd.addEventListener("click", handleClick);
src 폴더의 index.js를 바꾸었다.
해석
import { createStore } from "redux";
const btnAdd = document.getElementById("plus");
const span = document.querySelector("span");
const PLUS = "PLUS";
function Store (number = 0, action) { // 데이터 정의, action은 redux를 변환하는 인자
switch(action.type){ // action의 type에 따른 분기문
case PLUS: // case PLUS에선
return number +1; // number를 1씩 더함
default:
return number;
}
}
const countStore = createStore(Store); // createStore로 Store를 redux 데이터 저장소로 만든다.
btnAdd.addEventListener("click", handleClick); // 버튼을 클릭할때마다 handleClick 실행
function handleClick(){
countStore.dispatch({type: PLUS}); // redux의 데이터를 변환한다. type PLUS로
}
countStore.subscribe(onChange); // redux의 상태가 변할때마다 함수 onChange가 실행된다.
function onChange(){
span.innerText = countStore.getState(); // rdeux의 상태를 getState로 가져온뒤,
// span의 내부텍스트로 대입한다.
}
store내의 state는 변수를 변화시키는 게 아니라
새로운 변수를 재 정의하는 것이다.
이 개념은 hook의 개념과 같으니 어렵지 않을 것이다.
지금은 문제없을 건데 array / object를 쓸 때 기억하자.
추가하거나 제거하는 게 아닌 재정의를 해야 한다.
끝
'웹개발(프론트) > React' 카테고리의 다른 글
Redux Toolkit (0) | 2021.04.15 |
---|---|
Redux by react (0) | 2021.04.14 |
useMemo (0) | 2021.04.04 |
useReducer (0) | 2021.04.03 |
useEffect (0) | 2021.04.02 |
- Total
- Today
- Yesterday
- 접근성
- Hook
- Redux
- 이쁜코드
- html
- 랜더링
- 쿠키
- visualcode
- nodejs
- usecookies
- 서버
- dom
- 무료아이콘
- async
- switch
- CSS
- 비동기
- SVG
- Expo
- 클릭
- 아이콘
- 웹접근성
- 에러
- Router
- 가상샐렉터
- proptype
- touchable
- useReducer
- homebrew
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |