-
항해99 22일차-리덕스카테고리 없음 2021. 11. 24. 10:49
**리덕스
리액트에서 데이터는 단방향으로 흐른다.
(부모의 state를 자식은 props로 받아옴)
이때 자식은 부모의 state를 수정할 수 없다.
그래서 필요한 것이 리덕스이다.
리덕스-전역상태관리
전역데이터 저장소.
부모컴포넌트, 자식컴포넌트 모두에게 포함된 것이 아니고 완전히 별도로 있는 데이터
이 데이터를 부모, 자식이 가져다 쓰면 된다.
부모가 a라는 데이터를 가지고 있을 때 자식 컴포넌트 1,2,3,4가 있다.
4 컴포넌트만 a라는 데이터를 필요로 한다면 1,2,3컴포넌트는 오직 4에 전달하기위해 데이터를 가지고 있는 것이다.
(props drilling)
이 때에도 a데이터를 전역데이터 저장소에 넣어놓고 4컴포넌트만 가져다 쓰면 된다.
전역상태관리가 리덕스만 있는 것은 아님(리액트 훅도 존재)
*상태관리 흐름
<흐름을 알기 전 기억해야 할 것>
1. 전역으로 흐르는 데이터가 있다.
2.데이터는 컴포넌트가 참조, 수정 할 수 있다.
3.바뀐 데이터 값을 구독중인 다른 컴포넌트들도 볼 수 있다.
-스토어: 전역 데이터가 있는 곳
-리듀서: 데이터를 수정하는 공간
-액션: 컴포넌트에서 데이터를 수정하는 것
-액션 후 리렌더링 된다.(수정한 값을 데이터를 구독 중인 다른 컴포넌트 들에게도 전달)
https://ko.redux.js.org/introduction/getting-started/
Redux 시작하기 | Redux
소개 > 시작하기: Redux를 배우고 사용하기 위한 자료
ko.redux.js.org
리덕스 공식문서
https://ko.redux.js.org/api/store
Store | Redux
ko.redux.js.org
스토어의 내장함수 참고하기
https://github.com/erikras/ducks-modular-redux
GitHub - erikras/ducks-modular-redux: A proposal for bundling reducers, action types and actions when using Redux
A proposal for bundling reducers, action types and actions when using Redux - GitHub - erikras/ducks-modular-redux: A proposal for bundling reducers, action types and actions when using Redux
github.com
덕스구조 참고하기
1. Reducer는 반드시 export default로 내보내야 한다.
2. export로 (함수를 사용해서)action creator들을 내보내야 한다.
3.action type은 프로젝트이름/reducer/ACTION_TYPE
*리덕스 모듈 예제
// widgets.js // Actions const LOAD = 'my-app/widgets/LOAD'; //프로젝트이름/모듈명(리듀서명)/어떤 액션인지 const CREATE = 'my-app/widgets/CREATE'; const UPDATE = 'my-app/widgets/UPDATE'; const REMOVE = 'my-app/widgets/REMOVE'; // Reducer export default function reducer(state = {}, action = {}) { switch (action.type) { // do reducer stuff default: return state; } } // Action Creators export function loadWidgets() { return { type: LOAD }; } export function createWidget(widget) { return { type: CREATE, widget }; //자바스크립트 에서는 key값과 value가 같으면 생략 가능하다 {widget:widget}={widget} } export function updateWidget(widget) { return { type: UPDATE, widget }; } export function removeWidget(widget) { return { type: REMOVE, widget }; } // side effects, only as applicable // e.g. thunks, epics, etc export function getWidget () { return dispatch => get('/widget').then(widget => dispatch(updateWidget(widget))) } //미들웨어->데이터를 서버에서 받아와서 수정하는 경우 비동기 통신이기 때문에 바로 수정 불가.(데이터를 받아오는 시간이 필요) 이럴 때 미들웨어를 써줘야한다.
**설치
yarn add react-router-dom@5.2.1
yarn add styled components
yarn add redux react-redux