props drilling
이라는 나의 불쌍한 머리에 드릴링을 하는 문제를 야기한다.props drilling
은 props를 전달하는 용도로만 쓰이는 컴포넌트들을 거치면서 데이터를 전달하는 현상을 의미한다. props drilling의 문제점
- 코드의 가독성이 매우 나빠지게 됩니다. => props의 동선을 파악하면서 코드를 이해해야하기 때문
- 코드의 유지보수 또한 힘들어지게 됩니다. => side effect
- state 변경시 Props 전달 과정에서 불필요하게 관여된 컴포넌트들 또한 리렌더링이 발생합니다.
- 따라서, 웹성능에 악영향을 줄 수 있습니다.
그렇다면, 상태들을 저장소에 보관하고 필요할 때 꺼내 쓸 수 있다면, 얼마나 좋을까?
(출처 : https://velog.io/@huurray/React의-탄생과-Flux-패턴에-대하여)
Action 객체
가 생성된다.Action 객체
는 Dispatch 함수
의 인자로 전달된다.Dispatch 함수
는 Action 객체
를 Reducer 함수
로 전달해준다.Reducer 함수
는 Action 객체
의 값을 확인하고, 그 값에 따라 전역 상태 저장소 Store
의 상태를 변경한다.Redux에서는 Action → Dispatch → Reducer → Store 순서로 데이터가 단방향으로 흐르게 된다.
.
.
.
... 코드로 진행을 정리해보자.
import { Provider } from 'react-redux';
import { legacy_createStore as createStore } from 'redux';
root.render() 에 <App/>
을 <Provider>
로 감싸주고, Provider의 props로 store = {store}
를 넣어준다
store 변수를 선언하고 createStore라는 메서드를 할당시킨다. const store = createStore()
이때 createStore는 인자로 reducer 함수를 갖는다.
reducer 란 현재 상태와 액션 객체를 받아, 필요하다면 새로운 상태를 리턴하는 함수이다. 액션 유형을 기반으로 이벤트를 처리하는 이벤트 리스너라고 생각하면 된다. 반드시 순수함수로 작성해야한다.
reducer 함수를 작성해준다. 첫번째 인자에는 기존 state가 들어온다. 첫번째 인자에는 default value를 꼭 설정해준다. 그렇지 않을 경우 undefined가 할당되기 때문이다.
const counterReducer = (state = count, action) => {}
중괄호 안에 로직을 작성한다.
const counrterReducer = (state = defaultValue, action => {
switch(action.type){
case 'INCREASE':
return state + 1
// 해당 되는 경우가 없을 땐 기존 상태를 그대로 리턴
default:
return state
export const increase = () => {
return {
type: 'INCREASE'
}
}
import { useDispatch } from 'react-redux';
import { increase } from './index.js'
export default function App() {
const dispatch = useDispatch()
const state = useSelector((state) => state);
const plusNum = () => {
dispatch( increase() )
};