Redux
크로스 컴포넌트 또는 앱 와이드 상태를 위한 상태 관리 시스템
데이터가 변경되어서 하나의 컴포넌트에 속하는 UI에 영향을 미치는 상태
-ex)input
을useState
로 입력을 state변수에 저장
useState
를 사용해서 컴포넌트 안에서 로컬 상태를 관리 복잡하면useReducer
다수의 컴포넌트에 영향을 미치는 상태
-ex) 모달 컴포넌트 다수 컴포넌트에 영향,
useState
,useReducer
props
이용
애플리케이션의 모든 컴포넌트에 영향을 미치는 상태
-ex)사용자 인증
-> 컨텍스트있는데 왜 리덕스 써야함??
리액트 컨텍스트를 쓰면
prop
체인이나
prop 드릴링
을 하지 않을 수 있고,
Context
와ContextProvider
컴포넌트를 중심으로상태를 관리할 수 있음
둘다 사용할 수도 있음 앱 와이드 상태에서 일반적으로 둘중 하나만 사용하지만 앱에서 중요한 일부 다중 컴포넌트 상태에서는 컨텍스트를 사용해 혼합할 수도 있음
대형 프로젝트에서 설정, 상태가 복잡해질 수 있음
ex)Provider
를 계속 포함시켜줘야함 - 중첩
빈번히 일어나는 업데이트에는 효율이 좋지않음 유동적인 상태 확산을 대체할 수 없음
애플리케이션의 데이터 저장소 / 한개의 저장소
전체 애플리케이션의 모든 상태를 저장
--> 직접 관리할 필요 없음
- 컴포넌트가 저장소를 구독하고
- 데이터가 변경될 때마다 저장소가 컴포넌트에 알려줌
- 컴포넌트는 필요한 데이터를 받음
저장된 데이터를 직접 조작하지 않음
useReducer
랑은 다름 리듀서 함수는 입력을 받아서 그 입력을 변환하고 줄이는 함수
- 순수함수여야함
input:Old State + Dispathced Action
Output: New State Object
state는 초기 상태로 쓰이고
action은 추가적인 속성으로 쓰임 따라서 초기상태는type
마다 설정해줘야하며 (initialState를 덮어쓰는 개념이기 때문)
추가적인action
은 사용할 컴포넌트에서 똑같이 적용시켜줘야함
action
은 추가payload
및데이터
를 가짐
import { createStore } from "redux";
//store, components, Action, Reducer Fuction
const redux = require("redux");
const initialState = { counter: 0, showCounter: true };
//Reducer - 저장소를 변경해주는 역할
const counterReducer = (state = initialState, action) => {
if (action.type === "increment") {
return {
counter: state.counter + 1,
showCounter: state.showCounter,
};
}
if (action.type === "decrement") {
return {
counter: state.counter - 1,
showCounter: state.showCounter,
};
}
if (action.type === "increment5") {
return {
counter: state.counter + action.amount,
showCounter: state.showCounter,
};
}
if (action.type === "toggle") {
return {
showCounter: !state.showCounter,
counter: state.counter,
};
}
return state;
};
//Store - 데이터 관리, 어떤 리듀서가 store를 변경하는지
const store = createStore(counterReducer);
export default store;
createSlice
여러 조각을 생성 코드 유지보수 쉽게
- name
- inintialState
- reducers: method들
자동으로 최근 값을 받음
createStore에는 하나의 리듀서만 전달해야 한다.
configureStore
는 여러 개의 리듀서를 하나의 리듀서로 쉽게 합칠 수 있다
const store = configureStore({
reducer: { counter: counterSlice.reducer },
});
리듀서 함수가 아니라 객체를 전달
(key값을 설정해서)