리액트 상태 관리 라이브러리 (가장 많이 사용하는)
컴포넌트 상태 업데이트 관련 로직을 다른 파일로 분리 → 더 효율적인 관리 가능
컴포넌트끼리 똑같은 상태 공유 필요 시 → 여러 컴포넌트 거치지 않고 손쉽게 상태 값 전달/업데이트 가능
최적화(실제 업데이트 필요한 컴포넌트만 리렌더링)
전역 상태 관리 시 → 효과적
Context API
↕ 리덕스와 비교
// 1
{
type: 'TOGGLE_VALUE'
}
// 2
{
type: 'ADD_TODO',
data: {
id: 1,
text: '리덕스 배우기'
}
}
// 3
{
type: 'CHANGE_INPUT',
text: '안녕하세요'
}
// 화살표 함수
const changeInput = text => ({
type: 'CHANGE_INPUT',
text
})
// 일반 함수
function addTodo(data) {
return {
type: 'ADD_TODO',
DATA
}
}
사용 이유
변화 만들 때마다 액션 객체 만들어야 함.
→ 매번 (액션 객체를) 직접 작성하기 번거로움
→ 실수로 정보 놓칠 수 있음
⇒ 이런 일 방지
현재 상태 & 전달받은 액션 객체
받음 → 두 값 참고 → 새로운 상태 반환 const initialState = {
counter: 1
}
// state가 undefined일 때는 initialState를 기본값으로 사용
function reducer(state = initialState, action) {
switch (action.type) {
case INCREMENT:
return {
...state, // 불변성 유지 (spread 연산자 사용 예시)
counter: state.counter + 1
};
default:
return state;
}
}
세팅
리듀서 첫 호출 시, state 값 = undefined
→ undefined일 때, initialState
을 기본 값으로 설정하기 위해 함수 파라미터에 기본 값 설정
상태의 불변성 유지하면서 데이터 변화 시켜야 함
→ spread 연산자(...) 사용
최대한 깊지 않은 구조
로 진행 추천불변성 관리&업데이트
가 번거롭지 않기 위해immer
라이브러리 사용하면 쉽게 리듀서 작성 가능루트 리듀서 (rootReducer)
스토어 만들 때 (createStore
함수를 사용하여) 리듀서 1개만 사용해야 함
→ 리듀서를 1개로 합쳐야 함
→ combineReducers
유틸 함수 (리덕스 제공) 사용하면 쉬움
형태 예시
import { combineReducers } from 'redux';
import counter from './counter'; // 리듀서 1
import todos from './todos'; // 리듀서 2
const rootReducer = combineReducers({
counter,
todos,
});
export default rootReducer;
플젝 1개 당 store 1개
스토어 내부
만드는 법 & 형식
만드는 법
createStore 함수 사용
→ 함수의 parameter에 리듀서 함수 넣기
형식
import {createStore} from 'redux';
(...)
const store = createStore(reducer);
(스토어 내장 함수 中 하나)
역할
사용 방식
dispatch(action)
→ 액션 객체를 파라미터로 넣어 호출
→ 호출 후: 스토어- 리듀서 함수 실행 → 새로운 상태 만듦
대체제: react-redux
(스토어 내장 함수 中 하나)
subscribe 함수 내부에 함수(listener)를 파라미터로 넣어 호출 시
→ 함수( listener )가 액션이 디스패치되어 상태가 업데이트 될 때마다 호출됨
형태
const listener = () => {
console.log('상태가 업데이트됨');
}
const unsubscribe = store.subscribe(listener);
unsubscribe(); // 추후 구독을 비활성화할 때 함수를 호출
리덕스 상태는 읽기 전용
→ 상태 업데이트 할 때
불변성 유지 이유
얕은 비교 검사 하기 때문
*얕은 비교 검사: 내부적으로 데이터 변경 감지하기 위함
프레젠테이셔널 / 컨테이너
컴포넌트 분리 (필수 X)리덕스 사용 시
액션 타입
, 액션 생성 함수
, 리듀서
코드 작성
일반적인 구조
디렉토리: actions, constants, reducers
내부: 기능 별로 파일 1개씩
Ducks 패턴
액션 타입
, 액션 생성 함수
, 리듀서
→ 기능 별로 파일 1개에 몰아서 다 작성
참고
'리액트를 다루는 기술'_저자 김민준