부모 컴포넌트에서 선언된 상태를 직접 변경하지 않고 상태별 변경 로직을 만들어 관리가 가능하게 하는 라이브러리 이다.
> npm install redux react-redux
import { Provider} from 'react-redux';
import { createStore, combineReducers} from 'redux';
let value = 100;
function reducer(initValue = value, action) {
if(action.type == "add"){
// 100 + 1 = 101
let newValue = initValue + {action.addValue};
return newValue;
} else {
return initValue;
}
}
// combineReducers 를 이용하면 여러개 가능.
let states = createStore( {reduce} );
<Provider store={states}>
<App />
</Provider>
let state = useSelector( ( state ) => { return state.reducer } );
let dispatch = useDispatch();
...
{/* 사용법 */}
dispatch({type:"add", addValue:1})
function reducer1(state = State1, action) {
if(action.type == "add1") {
...
} else if(action.type == "add2") {
...
} else if(action.type == "add3") {
...
}
}
function reducer2(state = State1, action) {
if(action.type == "add11") {
...
} else if(action.type == "add12") {
...
} else if(action.type == "add13") {
...
}
}
let states = createStore( combineReducers( {reducer1, reducer2} ) );
let state = useSelector( ( state ) => { return state } );
let dispatch = useDispatch();
...
{/* 사용법 */}
dispatch({type:"add1", addValue:1})
dispatch({type:"add11", addValue:1})
이쯤되면 이게 뭔 개소리인지 대충 짐작이 갈 것이다. combineReducers 는 선언된 리듀서를 하나로 합친다는 의미이고 여기서의 useDispatch는 두개의 리듀서에 모두 접근이 가능한데 어떤 state에 접근할 것인지는 action 에 실어서 보내면 되는 것이다. 이걸로 미루어 보면 state, reducer, action 의 선언이 매우 체계적이어야 한다는 것을 알 수 있다. 처음에 useDispatch 를 본 소감은 "대체 어떤 리듀서를 참조하는지 모르겠다" 였는데 차근차근 죽 뜯어보니 대충 이해가 되더라... 하...
각자 사용해야할 범위와 조건이 있다. 필자가 생각해본 사용 용도는 다음과 같다.
다음 포스팅에서는 라우팅을 다뤄 보도록 하겠다.