ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
*์ค์น :
ํดํท
npm install @reduxjs/toolkit react-redux
์ผ๋ฐ
npm install redux@4.1.2 react-redux
*์ธํ (1) : store.js ํ์ผ์ ๋ง๋ค๊ณ ์ฝ๋ ๋ณต๋ถ
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: { }
})
*์ธํ (2) : index.js ํ์ผ๋ก ๊ฐ์ Provider๋ผ๋ ์ปดํฌ๋ํธ์ import, ๊ทธ๋ฆฌ๊ณ ๋ฐ์ <Provider store={importํด์จ๊ฑฐ}> ์ด๊ฑธ๋ก <App/> ์ ๊ฐ์ธ์ค๋ค.
import { Provider } from "react-redux";
import store from './store.js'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
</React.StrictMode>
);
๋ฆฌ๋์ค ?
๋ฐ์ดํฐ๋ฅผ ํ ๊ตฐ๋ฐ ๋ชฐ์๋ฃ๊ณ , ์ฌ๊ธฐ์ ๊ธฐ์์ ๊บผ๋ด๋ณผ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฉ์ด
- Action
- ๐ ์ํ์ ๋ณํ๊ฐ ํ์ํ ๋(=๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋) ์ด๋ค.
- dispatch ์ฌ์ฉํ ๋ () ์์ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ฃ์๋ ํ์
// ์ก์ ์ ๊ฐ์ฒด์์. ์ด๋ฐ ์์ผ๋ก ์ฐ์ธ๋ค. type์ ์ด๋ฆ๊ฐ์๊ฑฐ! ์ ํฌ๊ฐ ์ ํ๋ ์์์ ๋ฌธ์์ด์ ๋ฃ๋๋ค {type: 'CHANGE_STATE', data: {...}}
- ActionCreator
- ๐ ์ํ์ ๋ณํ๊ฐ ํ์ํ ๋(=๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋) ์ด๋ค.
const PLUS_ONE = "PLUS_ONE"; // value๋ ์์๋ก ์์ฑ
// ์ก์
๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์ ์์ฑ
// export ๊ฐ ๋ถ๋ ์ด์ ๋ plusOne()๋ ๋ฐ์ผ๋ก ๋๊ฐ์ ์ฌ์ฉ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
export const plusOne = () => {
return {
type: PLUS_ONE, // type์๋ ์์์ ๋ง๋ ์์๋ก ์ฌ์ฉ (vscode์์ ์๋์์ฑ ์ง์)
};
};
// ๋ฆฌ๋์
const counter = (state = initialState, action) => {
switch (action.type) {
case PLUS_ONE: // case์์๋ ๋ฌธ์์ด์ด ์๋, ์์์ ์ ์ธํ ์์๋ฅผ ๋ฃ์ด์ค๋๋ค.
return {
number: state.number + 1,
};
case MINUS_ONE: // case์์๋ ๋ฌธ์์ด์ด ์๋, ์์์ ์ ์ธํ ์์๋ฅผ ๋ฃ์ด์ค๋๋ค.
return {
number: state.number - 1,
};
default:
return state;
}
};
- Reducer
- ๐ ๋ฆฌ๋์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์
- ์ก์ ์์ฑ ํจ์๋ฅผ ๋ถ๋ฆ > ์ก์ ์ ๋ง๋ฌ > ๋ฆฌ๋์๊ฐ ํ์ฌ ๋ฐ์ดํฐ์ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ > ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ง๋ฌ > ๋ฆฌํด
// ๊ธฐ๋ณธ ์ํ๊ฐ์ ์์๋ก ์ ํด์คฌ์ด์.
const initialState = {
name: 'woo0'
}
function reducer(state = initialState, action) {
switch(action.type){
// action์ ํ์
๋ง๋ค ์ผ์ด์ค๋ฌธ์ ๊ฑธ์ด์ฃผ๋ฉด,
// ์ก์
์ ๋ฐ๋ผ์ ์๋ก์ด ๊ฐ์ ๋๋ ค์ค
case CHANGE_STATE:
return {name: 'woo1'};
default:
return false;
}
}
- Store
- ๐ ์คํ ์ด์๋ ๋ฆฌ๋์, ์ ํ๋ฆฌ์ผ์ด์ , ๋ฆฌ๋์ค์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ , ์ก์ ์ ํธ์ถํ๊ธฐ ์ํ ๋ด์ฅ ํจ์๊ฐ ํฌํจ ๋จ
- useDispatch
- ๐ ์ก์ ๊ฐ์ฒด ๋ณด๋ผ๋ ์ฐ๋ ํจ์
// src/App.js
import React from "react";
import { useDispatch } from "react-redux"; /1/ import ํด์ฃผ์ธ์.
const App = () => {
const dispatch = useDispatch(); /2/ dispatch ์์ฑ
return (
<div>
<button
/3/ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐ
onClick={() => {
// ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ์ ๋ dispatch๊ฐ ์คํ๋๊ณ , ()์์ ์๋ ์ก์
๊ฐ์ฒด๊ฐ ๋ฆฌ๋์๋ก ์ ๋ฌ๋๋ค.
dispatch({ type: "PLUS_ONE" });
}}
>
+ 1
</button>
</div>
- useSelector
- ๐ ์ปดํฌ๋ํธ์ ์คํ ์ด๋ฅผ ์กฐํ ํ ๋ ์ฐ๋ ํจ์
- payload
- ์ก์ ๊ฐ์ฒด์ ๋ชฉ์ ์ด๋ ๊ฐ์ด ๋ด์ ๋ณด๋ด์ฃผ๋ ๊ฒ
- Duck ๊ตฌ์กฐ
์์ )
const ADD_NUBER = 'ADD_NUMBER';
const MINUS_NUMBER = 'MINUS_NUMBER';
export const addNumber = (payload) => {
return {
type: ADD_NUBER,
payload,
};
};
export const minusNumber = (payload) => {
return {
type: MINUS_NUMBER,
payload,
};
};
const initialState = {
number: 0,
};
const counter = (state = initialState, action) => {
switch (action.type) {
case ADD_NUBER:
return {
number: state.number + action.payload,
};
case MINUS_NUMBER:
return {
number: state.number - action.payload,
};
default:
return state;
}
};
export default counter;
import React from 'react';
import { useState } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { addNumber, minusNumber } from './redux/modules/counter';
const Redux = () => {
const dispatch = useDispatch();
const [number, setNumber] = useState(0);
const globalNumber = useSelector((state) => state.counter.number);
const onChangeHandler = (e) => {
const { value } = e.target;
setNumber(+value);
};
const onClickAddNumberHandler = () => {
dispatch(addNumber(number));
};
const onClickMinusNumberHandler = () => {
dispatch(minusNumber(number));
};
console.log(number);
return (
<div>
<div>{globalNumber}</div>
<input type="number" onChange={onChangeHandler} />
<button onClick={onClickAddNumberHandler}>๋ํ๊ธฐ</button>
<button onClick={onClickMinusNumberHandler}>๋นผ๊ธฐ</button>
</div>
);
};
export default Redux;
728x90
'๐Frontend > ๐React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Redux-toolkit ์ค์น ๋ฐ ์ธํ (0) | 2022.08.06 |
---|---|
[React] Router ? (0) | 2022.07.30 |
[React] onChange (0) | 2022.07.26 |
[React] Mapํจ์ (0) | 2022.07.26 |
[React] ๋ชจ๋ฌ์ฐฝ(์ผํญ ์ฐ์ฐ์) (0) | 2022.07.26 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
๋งํฌ
TAG
- styled-components
- ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ
- sass
- Python
- ์๊ณ ๋ฆฌ์ฆ
- Git Code
- JWT
- DESIGN
- ํญํด99
- ํธ๋ฌ๋ธ ์ํ
- CS
- Til
- JavaScript
- scss
- git
- db
- CS ์คํฐ๋
- Router
- flask
- react
- API
- CSS
- DB๋ชฝ๊ณ
- Wil
- ๋ฉ์ดํน ์ฑ๋ฆฐ์ง
- HTML
- ์๋ฐ์คํฌ๋ฆฝํธ
- ํฌ๋กค๋ง
- ์๋ฒ
- Redux
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
๊ธ ๋ณด๊ดํจ