(of a topic, attributive, postpositive) Redone, restored, brought back, or revisited. 돌아온.
After an unusually cold August, September felt like summer redux as a heatwave sent temperatures soaring.
redux 라는 단어의 뜻이랑 별 상관은 없는 듯 하다.
Redux 는 상태관리를 위한 자바스크립트 라이브러리이다.
Redux 는...
상태에는 local, global 두가지 종류가 있다.
Local state 는 한 컴포넌트 안에서 정의되어 그 컴포넌트 안에서만 관리되는 state 이다.
Global state 는 한 컴포넌트 안에서 정의되어 다른 컴포넌트에서 관리되는 state 이다.
React 에서 하위 컴포넌트가 상위 컴포넌트의 state 에 접근하려면 props 로 state 나 state 를 변경하는 함수를 전달해야 한다. 그런데 만약 5단계 밑의 자식에게 전해야 하다면 매 자식 컴포넌트마다 props 로 전달해야 한다. 매 컴포넌트가 이 props 가 꼭 필요하지 않는 경우도 있기 때문에 중간에 오류가 나면 관리가 힘들다. 따라서 Redux 를 이용하여 전역 상태 저장소를 만들어 자식 component 들을 거지치 않고도 자식 컴포넌트가 state 에 접근할 수 있도록 만들어준다.
Single source of truth (store)
State is read-only (only through action)
Changes are made with pure functions (reducer function)
import { createStore } from 'redux'
// REDUCER
// 현재의 state 와 action 객체를 받아 새로운 state 를 return 하는 함수.
function myReducer(state = { value: 0 }, action) {
switch(action.type) {
case 'increment':
return { value: state.value + action.value }
case 'decrement':
return { value: state.value - 1 }
}
}
// STORE
// app 의 state 를 들고 있는 store 객체이다.
const store = createStore(myReducer)
// ACTION
// Action creator - action 객체를 만든다.
function increment(value) {
return {
type: 'increment',
value // value: value
}
}
function decrement(){
return { type: 'decrement' }
}
// DISPATCH
// 상태를 update 하는 유일한 방법은 dispatch() 함수에 action 객체를 전달하는 것이다.
// store는 reducer 함수를 실행하고 상태를 update 하여 저장한다.
function handleIncrement(value){
store.dispatch(increment(value))
}
function handleDecrement(){
store.dispatch(decrement())
}
// DISPATCH for react-redux (redux hooks)
useDispatch(함수)
// state 조회
handleIncrement(4)
console.log(state.getState()) // { value: 4 }
// SELECTOR
// Selector 함수는 어떤 state 를 store 에서 가져오는지 지정하는 함수다.
const selectMyValue = function(state) { return state.value }
// 'value' 라는 상태를 가져올 것이다.
const currentValue = selectMyValue(store.getState())
console.log(currentValue) // 4
// SELECTOR for react-redux (redux hooks)
const state = useSelector(state => state.myReducer);
이미지: https://redux.js.org/tutorials/essentials/part-1-overview-concepts
Redux 를 사용한다고 해서 react state 를 사용하지 않는건 아니다. 둘을 섞어 쓴다.
보통 자신의 component 안에서 해결되는 state 는 react state 를 사용하고, props 를 통해 전달되야 하는 state 는 redux 를 사용하면 좋다.
리덕스에서 비동기 작업을 처리할 때는 redux-thunk 라는 미들웨어를 많이 사용한다.
근데 이해하기 좀 어렵다.
Redux-saga 라는 것도 있다.
Presentational component: 마크업을 생산하는 컴포넌트
Container component: 상태를 관리하고 기능을 담당하는 컴포넌트