Redux에 대해서 알아봅시다.
리액트 상태 관리 라이브러리
컴포넌트의 상태 업데이트 관련 로직을 다른 파일로 분리시켜서 효율적으로 관리할 수 있음
전역 상태를 관리할 때 효과적임
Context API + useReducer Hook 과 Redux는 매우 흡사
(redux도 reducer와 action이라는 개념을 사용함)
# redux 기능을 제공해주는 모듈
npm install redux
# 리액트와 redux의 연동 기능을 제공해주는 모듈(connect, mapStateToProps ...)
npm install react-redux
{
type: "CHANGE_INPUT",
text: "안녕하세요"
}
액션 생성 함수
액션 객체를 만들어주는 함수
→ 변화가 있을 때마다 액션 객체를 만들어야 하는데 번거로움을 방지하기 위해 함수로 만듦
리듀서
변화를 일으키는 함수
→ 액션을 만들어서 발생시키면 리듀서가 현재 상태(state
)와 전달받은 액션(action
) 객체를 파라미터로 받아옴
그 두 값을 참고하여 새로운 상태를 만들어 변환
useReducer
Hook을 사용할 때 작성하는 리듀서와 같은 형태임
→ 그러나, useReducer
에서는 default로 에러 처리를 하는 것이 일반적이지만, 리덕스의 리듀서에서는 기존 state를 그대로 반환해야함
스토어
리덕스에서는 한 어플리케이션 당 하나의 스토어를 만듦
→ 현재의 앱 상태와 리듀서, 추가적인 내장 함수가 포함되어있음
// 스토어 만들기
const store = createStore(reducer);
// 현재 상태 불러오기
const state = store.getState();
디스패치
스토어의 내장함수 중 하나
액션을 발생시키는 것. 파라미터로 액션을 전달함 → eg) dispatch(action)
호출을 하면, 스토어는 리듀서 함수를 실행시켜 해당 액션을 처리하는 로직이 있다면 액션을 참고하여 새로운 상태를 만들어 줌
구독(subscribe)
스토어의 내장함수 중 하나
함수 형태의 값을 파라미터로 받아옴. 함수를 전달해주면, 액션이 디스패치 되었을 때 마다 전달해준 함수가 호출됨.
→ 쓸 일 거의 없음.
그래서, 위 개념들이 어떻게 연결 되는건지?
상태 값을 사용하는 컴포넌트가 스토어에 구독(스토어에게 함수 전달)
→ 스토어는 상태 값이 변경되면 전달받은 함수 호출
상태 값을 변경하는 컴포넌트가 스토어에 dispatch로 action 전달
→ action은 상태 변화 시 참조할 수 있는 객체
스토어는 액션의 타입을 참조하여 리듀서를 통해 새로운 상태를 만들어서 반환함
상태의 변화가 생기면 구독하고 있던 컴포넌트에게 알림(구독할 때 전달받은 함수)
→ 새로운 상태를 받고 리렌더링
connect
함수 : 리덕스의 상태 또는 액션 생성 함수를 컴포넌트의 props로 받아올 수 있음useSelector
, useDispatch
, useStore
: 손쉽게 상태를 조회하거나 액션을 디스패치 할 수 있음액션 타입, 액션 생성함수, 리듀서가 모두 들어있는 자바스크립트 파일
모듈 이름/액션 이름
의 형태로 작성 (나중에 프로젝트가 커졌을 때 액션의 이름이 충돌되지 않게 하기 위해서)export
키워드 씀 (다른 파일에서 이 함수를 가져다 쓸 수 있게 하기 위해서)export default
키워드 사용하여 내보냄createStore
함수를 사용하여 스토어를 만들 때는 리듀서를 하나만 사용해야함 (리듀서가 여러 개라면 하나로 합쳐줘야 함. 리덕스의 combineReducers
함수 사용)App
컴포넌트를 react-redux
에서 제공하는 Provider
컴포넌트로 감싸준다.connect
함수 : 컨테이너 컴포넌트와 리덕스를 연동하기위해 사용함.connect(mapStateProps, mapDispatchToProps)(연동할 컴포넌트)
const makeContainer = connect(mapStateProps, mapDispatchProps)
makeContainer(연동할 컴포넌트)
위 두 코드는 완전히 같은 의미
connect 함수를 호출하면 또 다른 함수가 반환됨
그 함수에 연동할 컴포넌트를 파라미터로 전달하면 리덕스와 연동된 컴포넌트가 만들어짐
mapToStateProps
: 리덕스 스토어 안의 상태를 컴포넌트의 props로 넘겨주기 위해 설정하는 함수
mapDispatchToProps
: 액션 생성 함수를 컴포넌트의 props로 넘겨주기 위해 사용하는 함수
bindActionCreators
: 액션 생성 함수의 갯수가 많아진다면, 각 함수를 생성하고 dispatch로 감싸는 작업이 번거로울 수도 있음. bindActionCreators
함수는 리덕스에 내장되어있는 함수이며, 액션함수를 자동으로 설정해주어 dispatch 과정을 손쉽게 해준다.bindActionCreators
작업을 해줌참조 링크
https://react.vlpt.us/redux/