리덕스는 자바스크립트 앱을 위한 예측 가능한 상태 컨테이너이다.
Redux 공식문서
리덕스는 데이터를 스토어(store) 에서 관리한다.
스토어의 데이터가 변경되는 과정이다.
컴포넌트는 dispatch( ) 함수를 통해 리듀서에 액션을 전달한다.
액션에는 리듀서에서 처리해야 할 작업의 이름과 데이터가 객체 형태로 들어있다.
리듀서는 액션을 받아 스토어 변경 작업을 진행한다.
스토어 변경 작업이 완료되면 connect( ) 함수로 연결된 컴포넌트에 변경된 스토어의 데이터를 전파하여 동기화 한다.
음식점으로 비유를 해보자면
component : 손님
dispatch ( ), connect ( ) : 종업원
action : 주문서
reducer : 요리사
손님(컴포넌트)이 종업원(dispatch ()) 에게 음식을 주문하면 종업원은 주문서(액션)을 요리사(리듀서)에게 전달한다.
요리사가 음식을 완성하면 (connect())가 손님에게 음식을 전달한다.
액션 (Action)
액션 생성함수 (Action Creator)
리듀서 (Reducer)
스토어 (Store)
디스패치 (dispatch)
구독 (Subscribe)
셀렉터 (Selector)
npm i redux react-redux
npm i--save-dev redux-devtools-extension
createStore() 함수 사용법
createStore( reducer, /* initial state */ , /* enhancer */ )
스토어 생성하기
react-redux에서 제공하는 스토어 데이터 공급자이다. Provider 아래에 배치한 컴포넌트들이 스토어에 연결될 것 이다.
리덕스 개발자 도구 연동하기
const store = createStore(state => state,
window.__REDUX_DEVTOOLS_EXTENSION__&& window.__REDUX_DEVTOOLS_EXTENSION__())```
스토어를 생성할 때 데이터 초깃값을 설정하지 않아 (pin) : undefined라는 값을 확인 할 수 있다.
[State > Tree] 확인해 보면 데이터 초기값이 잘 들어왔다.
액션
//액션 예시
{
type : ’SET_LOADING’ ,
payload : true ,
}
{
type : ‘SET_USER’ ,
payload : {name : ‘Park’, age : 20 }
}
리듀서
function reducer ( state, action )
{
return state;
}
const reducer = (state, action ) => state + action.payload
// (이전 데이터(state) 를 새로운 데이터(state + action.payload) 로 변경)
dispatch()
위 코드를 실행하고 확장 도구를 보면 SET_LOADING 이라는 액션 타입이 나타난다.
[Action]
을 누르면 상세 내용을 확인 할 수 있다.[State]
는 리듀서에 전달된 액션에 의해 바뀐 스토어 데이터(state)도 확인 할 수있다.[Diff]
는 이전 state와 현재 state를 비교하여 알려준다. 우리는 state를 변화 시키지 않았으므로 ‘states are equal’ 이라는 문구가 출력된다.