- Redux는 자바스크립트 어플리케이션에서 예측 가능한 상태의 관리를 해주는 container이다.
- 상태 관리를 위한 전역 상태의 저장소를 제공한다.
- Redux는 react의 하위 라이브러리가 아니고, 자바스크립트 어플리케이션이라면 사용이 가능하다.
- 컴포넌트간의 정보 공유가 필요할 때, 복잡성을 줄이기 위해서 상태관리 라이브러리인 redux를 사용한다.
// NPM 으로 설치
npm install redux
// Yarn 으로 설치
yarn add redux
참고 자료 : https://ko.redux.js.org/introduction/getting-started
- 1. Single Source Of Truth
redux에서 state는 모두 store에서 와야 한다.- 2. State is read-only
state를 수정할 때는 항상 action 객체를 사용해야 한다.
🍎 setState를 사용할 때 처럼 상태를 바로 수정하면 안된다.- 3. Changes are made with pure functions
reducer는 순수함수로 작성되야 한다.
side effect가 발생하면 예기치 못한 결과가 발생할 수 있다.
import { createStore } from 'redux';
const store = createStore(rootReducer);
import reducer from './redux/reducer';
import { Provider } from 'react-redux';
const store = createStore(reducer); // redux store 생성 후 Provider로 연결
// 크롬 확장 프로그램인 Redux Devtools을 사용하려면, 다음과 같이 작성한다.
// const store = createStore(reducer,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());
ReactDOM.render(
<React.StrictMode>
<Provider store = { store }>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
{
type: ‘ADD_TO_CART’,
payload: {
"name": "apple",
"quantity": 1,
}
}
const dispatch = useDispatch();
diapatch({
type: 'counting',
payload: {
"id" : 1,
"count" : 5,
},
});
const itemReducer = (state = initialState, action) => {
switch (action.type) {
case ADD_TO_CART:
return Object.assign({}, state, {
cartItems: [...state.cartItems, action.payload]
})
default:
return state;
}
}
🥝 데이터는 한 방향으로만 흘러야 한다.
- 상태를 예측 가능하게 만들어준다.
- 유지 보수를 쉽게 해준다.
- action과 state의 log를 기록하면, 디버깅에 유리하다.
🍷 크롬의 확장 프로그램인 redux devtool을 이용하면 쉽게 확인할 수 있다.- 순수함수를 이용하기 때문에, 테스트를 붙이기 쉽다.
결과적으로 redux를 이용하면 전역상태 store를 사용할 수 있고, 이를 통해 lifting state up과 props driling을 해결할 수 있다.
- Action, Reducer, Dispatch, Store을 연결하기 위해서 사용할 수 있는 두 가지 방법이 있다.
🍰 connect parameter를 통해 mapStateToProps, mapDispatchToProps 등 의 메소드를 이용한다.
🍪 useSelector나 useDispatch와 같은 Redux hooks를 이용하는 방법이 있다.
- redux hook의 사용을 위해서 react-redux를 설치해준다.
npm i react-redux 또는 yarn add react-redux
import { useSelector } from 'react-redux'
const state = useSelector(/* state를 인자로 갖는 콜백함수 */);
// state 내부에 store에 저장된 상태값들이 담긴다.
import { useDispatch } from 'react-redux'
const dispatch = useDispatch();
const handleClick(){
dispatch(/* action object */)
}
🍑 redux-thunk 깃허브 : https://github.com/reduxjs/redux-thunk/
// 설치
npm install redux-thunk
또는
yarn add redux-thunk
// 불러오기
import thunk from 'redux-thunk';
참고자료 : 코드 스테이츠