combineReducer
는 각각의Reducer
를 병합
Redux
는 코드의 양이 길어진다는 단점이 있다. 즉 Action
을 정의하다보면 switch ~ case
문의 양이 점점 증가한다.
그래서 이러한 문제점을 해결하기 위해 State
별로 각각의 Reducer
파일을 정의하여 Action
을 나눈 뒤 combineReducers
로 각각의 리듀서를 병합하여 사용한다.
combineReducer
의 사용방법은 다음과 같다.
해당 예제의 reducer
는 아래와 같으며 다음과 같은 순서로 combineReducer
를 적용한다.
import { HYDRATE } from 'next-redux-wrapper';
const initialState = {
name: 'Mirrer',
age: 20,
};
export const changeName = (data) => {
return {
type: 'CHANGE_NAME',
data,
}
};
export const changeAge = (data) => {
return {
type: 'CHANGE_AGE',
data,
}
};
const rootReducer = (state = initialState, action) => {
switch (action.type) {
case HYDRATE:
return {
...state,
...action.payload
};
case 'CHANGE_NAME':
return {
...state,
name: action.data,
}
case 'CHANGE_AGE':
return {
...state,
age: action.data,
}
default:
return state;
}
};
export default rootReducer;
initialState
의 State
를 개별 파일로 분할 // name.js
export const initialState = {
name: 'Mirrer',
};
export const changeName = (data) => {
return {
type: 'CHANGE_NAME',
data,
}
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'CHANGE_NAME':
return {
...state,
name: action.data,
}
default:
return state;
}
};
export default reducer;
// age.js
export const initialState = {
age: 20,
};
export const changeName = (data) => {
return {
type: 'CHANGE_AGE',
data,
}
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'CHANGE_AGE':
return {
...state,
age: action.data,
}
default:
return state;
}
};
export default reducer;
combineReducers
로 병합분할한 파일이 반환하는
Reducer
는 함수
// reducers/index.js
import { HYDRATE } from 'next-redux-wrapper';
import { combineReducers } from 'redux';
import name from './name'
import age from './age'
const rootReducer = combineReducers({
index: (state = {}, action) => {
switch (action.type) {
case HYDRATE:
return {
...state,
...action.payload
};
default:
return state;
}
},
name,
age,
});
export default rootReducer;