정리입니다. 참고한 블로그 맨 아래 있습니다.
state
: 그냥 데이터
store
: 객체로 저장된 앱의 상태(state 집합)
action
: 상태 변경을 일으키는 이벤트에 대한 정적인 정보
reducer
: 액션의 값에 따라 수행될 로직
dispatch
: 상태를 변경하는 스토어의 내장함수
subscribe
: 상태를 구독하는 스토어의 내장함수
selector
를 씀간단한 업데이트 흐름
컴포넌트에서 store에 action을 보냄(dispatch) → reducer는 action에 맞는 함수 실행→ 반환된 값으로 상태 업데이트
코드를 줄여준다.
1) Store
생성 시 devTools를 추가해주지 않아도 된다.
2) Slice
에서 액션타입 선언, 액션함수 생성, 리듀서의 기능을 수행한다
쓸모없는 라이브러리 설치를 안해도 된다.
1) 액션이 많아지면 redux-actions
2) 불변성 보존을 위한immer
3) 불필요 리렌더링을 막는 reselect
4) 비동기를 위한 thunk
, saga
toolkit은 위에서 saga
를 제외한 모든 기능을 제공한다.
위의 이유들로 redux에서도 toolkit 사용을 권장한다.
// redux + JS
npx create-react-app my-app --template redux
// Redux + TypeScript
npx create-react-app my-app --template redux-typescript
// 앱이 있을 때
npm install @reduxjs/toolkit
yarn add @reduxjs/toolkit
액션 타입, 액션 생성 함수, 리듀서의 기능을 한번에 사용
store/counter.js
import { createSlice } from "@reduxjs/toolkit";
const counterSlice = createSlice({
name: "counter",
initialState: {
value: 0,
},
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -=1;
},
incrementByAmount: (state, action) => {
state.value += action.payload;
},
},
});
// dispatch할 때 쉽게 사용하기 위한 export
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;
엥 근데 위에서 redux는 mutate 하지 말라고 해놓고 왜 함??
immer
가 있기에 가능기존의 createStore 대체
store/index.js
import { configureStore } from '@reduxjs/toolkit';
export const store = configureStore({
reducer: {
counter: counterSlice.reducer,
},
});
components/Counter.jsx
import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { decrement, increment } from "../store/counterSlice";
export default function Counter() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
<div>
<div>
<button
aria-label="Increment value"
onClick={() => dispatch(increment())}
>
Increment
</button>
<span>{count}</span>
<button
aria-label="Decrement value"
onClick={() => dispatch(decrement())}
>
Decrement
</button>
</div>
</div>
);
}
참고
https://ko.redux.js.org/tutorials/quick-start
https://velog.io/@djaxornwkd12/Redux-Toolkit-알아보기
https://velog.io/@whljm1003/redux-toolkit리덕스-툴킷-사용법