what is Redux?
Redux is a library, managing cross-component or app-wide state.
- local state | 하나의 컴포넌트에서 사용되는 state
- ex) input에 입력한 state
- cross component state | props을 통해 여러 컴포넌트에 영향을 미치는 state
- ex) modal
- app wide state | app 전체(또는 대부분)에 영향을 미치는 state
- ex) authorization
context vs. Redux
여러 컴포넌트에 영향을 미치는 state나, 앱 전체에서 사용될 수 있는 state를 관리할 때 react의 context api를 이용할 수 있다. 즉 redux는 context와 같은 역할을 한다. 그렇다면 왜 context 대신 redux를 사용할까?
- react context's potential disadvantage(내재/잠재하는 단점)
- 하나의 컴포넌트에 여러 provider를 제공할 수 있기 때문에, 사용하는 context가 많아지면 코드가 복잡해 진다.
- context는 자주 변하지 않는(low frequency change) state를 관리하는 데에 적합하기 때문에, 그렇지 않은 경우를 context로 관리하면 low perfomance 문제를 야기한다.
- redux는 context의 이러한 단점을 보완하기 위해 사용할 수 있는 라이브러리이다.
- 어플리케이션을 만들 때, 리덕스와 context 둘 중 하나를 사용하는 것이 아니라 둘 다 사용하는 경우가 더 많다.
- 보통 app wide state에 대해서는 리덕스와 context 둘 중 하나를 사용한다.
- cross component state는 두 가지를 ??? 혼용해서 사용할 수 있다.
how Redux works?
- one central state store | 리덕스는 단 하나의 data 저장소를 가지고 있으며, 여기에 어플리케이션의 모든 state를 저장할 수 있다.
- subscription | 어떤 컴포넌트를 subscription 상태로 셋업하면, 해당 컴포넌트는 store에 저장된 특정 data가 변경될 때 마다 그것을 알아차릴 수 있다.
- 컴포넌트는 store에 저장되어있는 state를 읽을 수는 있지만, 직접 그 state를 다른 값으로 변경할 수는 없다. => action을 이용한다.
- actions & dispatch | 컴포넌트는 reducer 함수에 특정한 액션을 전달(dispatch)할 수 있다.
- 이 때 action은 js 객체이며, reducer 함수에서 수행해야할 작업을 설명하고 있다.
- reducer | reducer 함수는 전달받은 action을 이용해서 store에 저장되어 있는 data를 변형할 수 있다(state를 업데이트 할 수 있다).
- 이 때 reducer function은 프로그래밍의 일반적인 개념이며, useReducer 훅 자체를 가리키는 것이 아니다.
- reducer function take some inputs then, transform and reduce them into a new output.
- reducer는 일반적인 js 함수이지만, redux 에 의해 호출된다.
- (oldState, action) => { return {new state} }
- 이전의 state와 전달받은 action을 input으로 받아서 새로운 state(보통 객체)를 반환해야 한다.
- reducer 함수 내부에서는 side effect를 수행하지 않아야 한다.
- 같은 input을 전달받았을 때에는 같은 output을 반환해야 한다.
- 이 때 reducer function은 프로그래밍의 일반적인 개념이며, useReducer 훅 자체를 가리키는 것이 아니다.
- 리액트에 국한되지 않고, 어느 js 프로젝트에서나 redux를 사용할 수 있다.
// node js
const redux = require('redux');
const counterReducer = (state = { counter: 0 }, action) => {
if(action.type === 'increment') {
return {
counter: state.counter + 1, // init value : 1
};
}
return state;
};
const store = redux.legacy_createStore(counterReducer);
const counterSubscriber = () => {
const latestState = store.getState();
console.log(latestState);
};
store.subscribe(counterSubscriber);
store.dispatch({ type: 'increment' }); // 2
- store.dispatch(action) | action을 전달하고 reducer를 실행한다.
- createStore(reducer)
- store를 만든다. 이 때 store의 data를 변형할 수 있는 reducer fn을 인자로 전달한다.
- reducer는 state와 action을 인풋으로 받아서, 새로운 state를 반환한다.
- store.subscribe | store에 저장된 state가 변경될 때 마다 실행할 subscriber를 등록한다.
- 정리
- dispatch를 이용해서 action을 전달하고, reducer를 실행한다.
- reducer는 state를 변형한다.
- state가 변경되면 등록된 subscriber를 실행한다.
- reducer 함수 내부에서는 action에 따라 다른 일을 수행한다.
'Study > npm Libraries' 카테고리의 다른 글
React with web accessibility (0) | 2022.09.19 |
---|---|
TanStack Query(React Query) (0) | 2022.07.24 |
React-router(v6) (0) | 2022.07.03 |
React-router (0) | 2022.07.01 |
React-redux & Redux-toolkit (0) | 2022.06.30 |