// Redux Toolkit
- Redux를 더 편리하고 쉽게 사용할 수 있게 도와주는 package
- redux toolkit에 redux가 포함되어 있기 때문에 redux를 별도로 설치할 필요가 없고, react-redux만 설치해주면 된다.
npm install @reduxjs/toolkit
npm install react-redux
// createSlice
- 자동으로 원래 있던 state를 복사하여 새로운 state 객체를 생성한다.
1. global slice 생성
const slice변수명 = createSlice({
name: ,
initialState: ,
reducers: {
dispatch함수명1(state, action) {},
dispatch함수명2(state) {},
},
});
- argument로 객체를 전달한다.
- reducer 객체 안에 메서드를 추가한다.
2. store에 생성한 slice 등록
const 저장소명 = configureStore({
reducer: { key명 : slice변수명.reducer }, // volume 클 경우
reducer: slice변수명.reducer // volume 작을 경우
});
- configureStore 함수가 여러 개의 reducer 함수를 하나로 합쳐준다.(store는 오직 하나만 존재하기 때문에)
- volume이 크지 않을 경우 reducer: slice변수명.reducer 로 등록해도 되지만, slice가 많아질 경우에는 key를 설정해준다.
3. action 객체 생성
export const action객체 = slice변수명.actions;
- redux toolkit에 의해 자동으로 메서드가 생기고, 그 메서드가 호출되면 action 객체가 생성된다.
4. 원하는 컴포넌트에서 action 사용하기
const 함수명 = () => {
dispatch(action객체명.dispatch함수명());
};
// payload가 있는 경우
const 함수명 = () => {
dispatch(action객체명.dispatch함수명(payload));
};
- Redux toolkit은 자동으로 payload라는 이름으로 전달되는 것들을 저장한다.
import classes from './Counter.module.css';
import { useDispatch, useSelector } from 'react-redux';
import { counterActions } from '../store';
const Counter = () => {
const dispatch = useDispatch();
const counter = useSelector((state) => state.counter);
const showCounter = useSelector((state) => state.showCounter);
const incrementHandler = (amount) => {
dispatch(counterActions.increment(amount));
};
const decrementHandler = () => {
dispatch(counterActions.decrement());
};
const toggleCounterHandler = () => {
dispatch(counterActions.toggle());
};
return (
<main className={classes.counter}>
<h1>Redux Counter</h1>
{showCounter && <div className={classes.value}>{counter}</div>}
<div>
<button onClick={() => incrementHandler(1)}>Increment</button>
<button onClick={() => incrementHandler(5)}>Increment 5</button>
<button onClick={decrementHandler}>Decrement</button>
</div>
<button onClick={toggleCounterHandler}>Toggle Counter</button>
</main>
);
};
export default Counter;
import { configureStore, createSlice } from '@reduxjs/toolkit';
const initialState = { counter: 0, showCounter: true };
const counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
increment(state, action) {
state.counter = state.counter + action.payload;
},
decrement(state) {
state.counter--;
},
toggle(state) {
state.showCounter = !state.showCounter;
},
},
});
const store = configureStore({
reducer: counterSlice.reducer,
});
export const counterActions = counterSlice.actions;
export default store;
'클라이언트 > React' 카테고리의 다른 글
[리액트(React)] 동적 Route (0) | 2024.02.18 |
---|---|
[리액트(React)] 라우터(Router) (0) | 2024.02.17 |
[리액트(React)] Redux with Class-based Component (0) | 2024.02.15 |
[리액트(React)] 리덕스(Redux) (0) | 2024.02.14 |
[리액트(React)] Custom Hook (0) | 2024.02.09 |