Redux (리덕스) 뭐냐 넌?
리덕스는 가장 많이 사용하는 리액트 상태 관리 라이브러리
- 컴포넌트의 상태 업데이트 관련 로직을 다른 파일로 분리하여 효율적 관리 가능
- 컴포넌트끼리 같은 상태를 공유해야 할 때도 Good
- 코드 유지 보수성 UP 작업 효율 UP 개발자 도구도 지원, 미들웨어 기능 제공 비동기 작업 효율 UP (리덕스 좋다는 소리....?)
1.액션
- 상태에 변화가 필요하면 (action) 발생
- 객체 형식
{ type : '액션의 이름'}
{ type : '액션의 이름', data : { id : 1, name : '뭐냐 이건'} }
결국 객체 형태로 저장하고 불러다 쓰겠다는 거잖아?
OOP?
2.액션 생성 함수 (action creator)
- 액션 객체를 만들어 주는 함수
const addTodo = data => ({
type : '액션의 이름',
data
}); // 화살표 함수
function addTodo(data) {
return {
type : '액션의 이름',
data
};
} // 함수
3.리듀서 (reducer)
- 변화를 일으키는 함수 (액션을 만들어서 발생시키면 리듀서가 현재 상태와 액션 객체를 참고하여 새로운 상태를 만들어 반환)
const initialState = {
counter : 1
};
function reducer(state = initialState, action) {
switch (action.type) {
case '액션의 이름' :
return {
counter : state.counter + 1
};
default :
return state;
}
}
4.스토어 (store)
- 한 개의 프로젝트는 단 하나의 스토어
- 스토어에는 현재 상태(state)와 리듀서(reducer)가 들어가 있고, 내장 함수도 있다.
5.디스패치 (dispatch)
- 스토어의 내장 함수 중 하나
- 액션 발생시키는 것 - dispatch(action)
- 이 함수 호출되면 스토어는 리듀서 함수를 실행 => 새로운 상태 만들어서 반환
6.구독 (subscribe)
- 스토어의 내장 함수 중 하나
- 이 함수에 리스너 함수를 파라미터로 넣어 호출 => 리스너 함수는 액션이 디스패치되어 상태가 업데이트될 때마다 호출 됨
const listener = () => {
console.log('state update 끝났다 주인 놈아.. 나 이제 쉰다.');
}
const unsubscribe = store.subscribe(listener);
unsubscribe(); // 구독 비활성화할 때 함수를 호출
리덕스의 세 가지 규칙
- 단일 스토어
- 하나의 애플리케이션 하나의 스토어
- 읽기 전용 상태
- 불변성 유지 (상태를 업데이트 할 때 기존의 객체는 건드리지 않고 새로운 객체를 생성해야 함.)
- 리듀서는 순수한 함수
- 리듀서 함수는 이전 상태와 액션 객체를 파라미터로 받는다.
- 파라미터 외의 값에는 의존 X
- 이전 상태는 그대로 유지하고, 변화를 준 새로운 상태 객체를 반환해야 함
- 같은 파라미터로 호출된 리듀서 함수는 같은 결과 값을 반환해야 함
- 랜덤 값 X / 네트워크요청 X ....등 => 리덕스 미들웨어로 처리하자.