컴포넌트끼리 데이터를 주고 받아야 한다면?
React는 일방향 데이터 흐름을 가지기 때문에 자식간의 다이렉트 데이터 전달은 불가능하므로 항상 부모 컴포넌트를 통해 주고 받아야 한다.
(번거롭고 힘겨워 보인다) / 이미지 출처 : React Training
하지만 너무 많은 props를 내려야 하거나 깊숙한 곳의 컴포넌트에 전달해야 한다면? 과정이 많아 질 수록 props를 추적하기 힘들어지고 유지보수도 힘들어지는 문제가 생긴다 =>Pros Drilling
이러한 문제점을 해결하기 위한 상태관리 라이브러리(State Management Tools)가 Redux이다.
(MobX, recoil 등 다른 라이브러리도 있다)
(훨씬 간결하다) 이미지 출처 : React Training
(이렇게 보니 안 간결하다)
Redux Undo
라는 라이브러리로 실행 취소 기능을 사용할 수 있다.redux를 시작하기 전 알고가야 할 개념정리를 먼저 뽀개장
저장하고 있는 상태값(aka.데이터)
딕셔너리 형태({[key]:value}) 형태로 보관한다
상태에 변화가 필요할 때 (= 가지고 있는 데이터를 변경할 때) Store에 접근하기 위해 발생한다
Action: 똑똑 store님,, 거 문 좀 열어 주십쇼,,~
Reducer가 Action과 이전의 state를 참고하여 새로운 state를 만들기 때문에 reducer가 구분할 수 있도록 객체 형식으로 이뤄진다.
{
type : '액션의 종류를 한번에 식별할 수 있는 문자열 or 심볼'
payload : '액션의 실행헤 필요한 임의의 데이터'
}
함수를 통해 액션을 생성해서 액션 객체로 return 해준다
하나의 액션 객체는 하나의 함수를 필요로 한다.
const actionCreator = (new_data) => {
return {
type: 'TEST',
data: new_data
};
액션을 주면 그 액션이 적용되어 달라진 (안 달라질수도...있음) 결과를 만들어 낸다.
=> 이전 State와 Action을 합쳐, 새로운 state를 만드는 조작
🤷♀️ pure한 함수여야한다
🤷♀️ immutable
Side Effect
를 야기하는 것들을 사용해서는 안된다.function reducer(previousState, action){
return newState
};
액션 생성함수로 -> 액션 만들고 -> 리듀서가 현재 상태(=데이터)와 액션 객체를 받아서 -> 새 데이터를 만들고 -> 리턴
** state를 직접 변경은 불가능하다!(읽기 전용)
가지고 있는 값을 새로운 값으로 만들어서 action으로만 변경~~
action에 따라 상태를 수정하는 reducer를 저장하는 단 하나의 객체
어플리케이션의 상태 값을 내장하며, 상태가 관리되는 곳
store의 몇가지 내장 함수들
store.dispatch(action)
store.subscribe()
import { createStore } from 'redux'
let store = createStore(reducer)
참고
https://tkssharma.gitbook.io/react-training/day-01/react-js-3-principles/one-way-data-flow
https://medium.com/@ca3rot/%EC%95%84%EB%A7%88-%EC%9D%B4%EA%B2%8C-%EC%A0%9C%EC%9D%BC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EC%89%AC%EC%9A%B8%EA%B1%B8%EC%9A%94-react-redux-%ED%94%8C%EB%A1%9C%EC%9A%B0%EC%9D%98-%EC%9D%B4%ED%95%B4-1585e911a0a6