이론적으로 알고 있지만 코드로 구현해보지 못했던 리덕스.
리덕스를 실제로 코드로 쳐보기 위해서 여러 가지 실습을 해보려고 한다.
첫 번째로 벨로퍼트의 카운터 만들기 실습을 해봤다.
실습을 하며 기억하고 싶은 내용을 간단하게 정리한다.
src 디렉토리 내부에 아래의 디렉토리들을 생성한다.
뷰만을 담당하는 컴포넌트와 데이터를 관리하는 컴포넌트를 나누는 구조.
프로젝트를 이해하기 쉽고 컴포넌트를 재사용하기 좋다.
presentational compoenent
container component
액션 타입
액션 생성자
리듀서에서는 초기 상태를 정해준다.
리듀서 함수에서는 현재 상태와 액션 객체를 파라미터로 받고
액션 타입에 따라 state 값을 다르게 변경하는 switch 문을 작성한다.
src 디렉토리 안의 index.js 파일에서 스토어를 생성한다.
createStore 함수를 불러온 다음에 파라미터로 리듀서를 넣으면 된다.
리액트 앱에 store 를 손쉽게 연동하기 위해서
react-redux 라이브러리에 내장되어 있는 Provider 를 사용한다.
store 를 연동할 컴포넌트를 provider 로 감싸고 props 로 store 를 설정한다.
뷰를 담당하는 컴포넌트와 데이터를 관리하는 컴포넌트를 나누는 식으로 리덕스 구조를 짜기로 했다. 데이터를 관리하는 컨테이너 컴포넌트를 store 에 연결하기 위해서는 react-redux 의 connect 함수를 사용한다. connect 함수의 파라미터로 1. 컴포넌트에 연결시킬 상태와 2. 액션함수를 전달한다. 그러면 컴포넌트를 리덕스 스토어에 연결시키는 또 다른 함수를 반환한다. 이 리턴된 함수의 파라미터로 뷰를 담당하는 컴포넌트를 넣어준다. 그러면 최종적으로 리덕스 스토어에 연결된 컨테이너 컴포넌트가 생성된다.
컴포넌트에 연결시킬 상태와 액션함수를 정의할 때는 각각 함수를 만든다.
state 를 파라미터로 받는 함수와 dispatch 를 파라미터로 받는 함수를 만든다.
이 함수로 객체를 반환하고 이를 props 로 사용한다.
-> 상태를 연결하는 mapStateToProps 함수와 액션 함수를 연결하는 mapDispatchToProps 함수를 만들어서 connect 함수에 전달해주고 전달받은 함수에 Counter 컴포넌트(뷰 담당) 를 전달하여 컨테이너 컴포넌트를 내보낸다.
기존 리듀서를 색상/ 숫자 리듀서로 분리하고
redux 의 combineReducers 를 통해 서브 리듀서를 합치고 루트 리듀서를 만든다.
reducers 디렉토리의 index.js 에서 각각의 리듀서를 객체형태로 전달해주면 리듀서가 합쳐진다.