- redux-toolkit์ ๊ธฐ์กด redux์ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฒ์ ์ ๋ชจ๋์ด๋ค.
- redux์ ๋ณธ์ง์ ๋์ผํ๊ณ , ๋ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ๊ฐ๋ํ ๋ฒ์
โ ์ค์น
npm install @reduxjs/toolkit react-redux
โ ์ฌ์ฉ๋ฒ
1. store.js ์ค๋น
// store.js
import { configureStore } from "@reduxjs/toolkit";
//redux store
export const store = configureStore({
reducer: {},
});
- reducer๊ฐ ํฌํจ๋ ๊ฐ์ฒด๋ฅผ configureStore ์ ์ ๋ฌํ๋ฉด ๊ฐ๋จํ redux store๊ฐ ๋ง๋ค์ด์ง๋ค.
- ์ด๊ฒ์ react ์ ์ ์ฉํ๊ธฐ ์ํด index.js ๋ก ๊ฐ์
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
//Provider์ store์ถ๊ฐ
import { Provider } from "react-redux";
import { store } from "./store";
ReactDOM.render(
//์ด๊ณณ์์ ์๋์ ๊ฐ์ด Provider์ store๋ฅผ ์ ๋ฌํ๊ณ App์ ๊ฐ์ผ๋ค
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
2. slice ๋ง๋ค๊ธฐ
๊ธฐ๋ณธ redux๋ก๋ ๋ฆฌ๋์๋ฅผ ๋ง๋ค ๋ switch๋ฅผ ์ด์ฉํด ์ก์
์ ๊ตฌ๋ถํ์ฌ ์ํ๋ฅผ ๋ณํ์์ผฐ๋ค.
๋ํ ๋์คํจ์น๋ฅผ ํธ์ถํ ๋๋ ๊ตฌ์กฐํ๋ ์ก์
์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ค์ผ๋ง ํ๋ค.
- toolkit์์๋ ์ด๋ฌํ ๋ณต์กํ ์ ์/์ฌ์ฉ์ ํํผํ๊ณ ์ createSlice ๋ผ๋ ์๋ก์ด API๋ฅผ ์ง์ํ๋ค.
// redux/counter.js
iimport { createSlice } from "@reduxjs/toolkit";
const initialState = {
value: 0,
};
export const counterSlice = createSlice({
//name์ ๊ฐ action์ ๋ํด useSelector ํ ๋ ์ฌ์ฉ
name: "counter",
//์ด๊ธฐ๊ฐ
initialState,
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
//actions
//dispatchํ ๋ ์ก์
์ ์ ๋ฌํด ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ณํ์ํฌ์ง๋ฅผ ๊ฒฐ์ ํ๋ค
export const { increment, decrement } = counterSlice.actions;
//reducer
export default counterSlice.reducer;
- createSlice๋ก slice๋ฅผ ๋ง๋ค๋ฉด, slice์ reducer, actions๊ฐ ์์ฑ๋์ด ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- counter์ ๋ํ ์ค๋น๋ ๋๋ฌ์ผ๋, ๋ค์ store๋ก ๋์๊ฐ reducer์ counter๋ฅผ ์ถ๊ฐํด์ค๋ค.
3. store.js ์ reducer ์ถ๊ฐ
import { configureStore } from "@reduxjs/toolkit";
//๋ฐฉ๊ธ ์ counter.js์์ export defaultํ counterSlice.reducer
import counterReducer from "./redux/counter";
//redux store
export const store = configureStore({
reducer: {
//add counterReducer
counter: counterReducer
},
});
4. ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๊ธฐ
//components/Counter.js
import React from "react";
import { useDispatch, useSelector } from "react-redux";
import { decrement, increment } from "../redux/counter";
const Counter = () => {
//useSelector๋ฅผ ํตํด redux store์์ ํน์ ๊ฐ์ ๊ฐ์ ธ์์ ์ฝ๋์์ ์ฌ์ฉ ๊ฐ๋ฅ
const count = useSelector((state) => state.counter.value);
//dispatch์ action์ ์ ๋ฌํ๋ฉด ํด๋น ๋์์ด ์คํ๋๋ค
const dispatch = useDispatch();
//increment(1์ฆ๊ฐ) ๋์
//์ปดํฌ๋ํธ์์ store ๋ก ๊ฐ์ ์ ๋ฌํ์ฌ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
const handleIncrement = () => dispatch(increment());
//decrement(1๊ฐ์) ๋์
const handleDecrement = () => dispatch(decrement());
return (
<div>
<p>Count: {count}</p>
<button onClick={handleIncrement}>increment</button>
<button onClick={handleDecrement}>decrement</button>
</div>
);
};
export default Counter;
'๐ Front-End > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React Query - ๋ง๋ค๊ธฐ (0) | 2022.10.25 |
---|---|
React Query โ (0) | 2022.10.25 |
React - SVG ํ์ผ ์ฌ์ฉ๋ฒ (0) | 2022.10.25 |
Styled-Components (0) | 2022.10.25 |
ํ๋ก์ ํธ ๋ฐฐํฌ ์ค๋น ๋ฐ ๋น๋ (0) | 2022.10.25 |