Redux는 자바스크립트 앱을 위한 예측 가능한 상태 컨테이너이다.
Redux를 이용하면 멀리 떨어져 있는 컴포넌트를 연결시키거나, 한 프로젝트 전체에서 참조해야 하는 상태 값이 있는데 모든 컴포넌트에 연결하기 까다로운 경우 유용하게 활용할 수 있다.
export const addCart = (item) => { // 액션 "생성 함수"
return {
type: "ADD_ITEM", // 액션 "객체"
payload: item,
};
};
액션은 type 속성 값을 가진 자바스크립트 객체
액션 생성함수는 그 액션 객체를 생성하는 역할을 하는 함수 **
액션 객체를 dispatch 메서드에 넣어서 호출 (useDispatch
)
액션 생성함수가 생성한 액션 객체는 리듀서를 거쳐 스토어를 업데이트하게 됨
const dispatch = useDispatch()
action.type
에 따라 따라 스토어가 업데이트 됨(state, action) => nextState // state(혹은 store)와 action 객체를 받고 다음 state 리턴
// cartReducers.js
function cartReducer(state = INITIAL_STATE, action) {
switch (action.type) {
case "ADD_ITEM":
return [...state, action.payload]; // 스토어의 이전 상태에 새로운 item을 추가
case "DELETE_ITEM":
return [...action.payload]
default:
return state; // 해당 사항 없으면 이전 상태를 그대로 리턴
}
}
// store/reducer/index.js
import { combineReducers } from "redux";
import cartReducer from "./cartReducer";
export default combineReducers({ cartReducer });```
- 리듀서는 **액션이 발생했을 때 새로운 상탯값을 만드는 함수** **(그냥 자바스크립트 함수!!)**
#### ⏩ Store
```javascript
import React from "react";
import ReactDOM from "react-dom";
import Routes from "./Routes";
import { Provider } from "react-redux";
import { createStore } from "redux";
import rootReducer from "./store/reducers";
const store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<Routes />
</Provider>,
document.getElementById("root")
);
Provider
)const items = useSelector((store) => store.cartReducer);
const middleWare = store => next => action => next(action);