Redux는 Javascript에서 흔히 쓰이는 State Container이다.
React뿐만 아니라 어떠한 Javascript 라이브러리와도 연결할 수 있는 State 관리 라이브러리이다.
어플리케이션에 컨테이너에서 데이터와 비지니스로 로직을 분리하여 리액트가 순전히뷰에만 관여할 수 있게해준다.
리덕스는 잠재적으로 React대신 다른 뷰 라이브러리로 바꿀 수 있게 해주기 때문에 어플리케이션을 더욱 유연하게 해준다.
Redux를 사용할 때 아주 중요한 이슈 중 하나가 바로 불변성이다. Redux에서는 어떤 데이터를 변경하려 할 때 그 데이터를 직접 변경하는 것이 아니고 내용이 바뀐 새로운 객체를 생성해야 한다.
예를 들어, '할 일' 목록을 요소로 갖는 배열에 새 '할 일'을 추가하는 Reducer가 있다고 하자. 아래와 같이 push() 메소드를 호출하여 추가해도 아무런 문제가 없어보이지만, 실제로 화면에는 새 할 일 목록이 출력되지 않는다.
function todos(state = ['react', 'redux'], action) {
switch (action.type) {
case 'ADD_TODO':
state.push(action.text);
default:
return state;
};
};
이렇게 하는 대신 스프레드 연산자를 사용하여 새로운 배열을 반환해야 한다.
function todos(state = ['react', 'redux'], action) {
switch (action.type) {
case 'ADD_TODO':
return [...state, action.text];
default:
return state;
}
}
const counter = useSelector( state => state.counter )
const dispatch = useDispatch()
const store = useStore()
리덕스 개발자 도구를 사용하면 현재 스토어의 상태를 개발자 도구에서 조회할 수 있고 지금까지 어떤 액션들이 디스패치 되었는지, 그리고 액션에 따라 상태가 어떻게 변화했는지 확인할 수 있고 추가적으로 직접 디스패치할 수도 있다.
$ yarn add redux-devtools-extenstion