[React] Redux

κΆŒμš©μ€€Β·2023λ…„ 12μ›” 6일
0
post-thumbnail

Redux

πŸ“Œ μ •μ˜

React와 ν•¨κ»˜ μ‚¬μš©λ˜λŠ” JavaScript μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœ 관리λ₯Ό μœ„ν•œ μƒνƒœ μ»¨ν…Œμ΄λ„ˆ λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. λ³΅μž‘ν•œ μƒνƒœ 관리λ₯Ό μš©μ΄ν•˜κ²Œ λ§Œλ“€μ–΄μ£Όλ©° Redux의 μ£Όμš” λͺ©ν‘œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό 예츑 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ–΄μ„œ 관리 및 디버깅을 μ‰½κ²Œ ν•˜κ³ , μƒνƒœ λ³€ν™”λ₯Ό 효율적으둜 μ²˜λ¦¬ν•˜λŠ” 것이닀.

β—οΈνŠΉμ§•

- Redux 데이터 흐름

ACTION
Action은 κ°„λ‹¨ν•œ JavaScript 객체이닀. μ—¬κΈ°μ—λŠ” μš°λ¦¬κ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ˜ μœ ν˜•μ„ μ§€μ •ν•˜λŠ” 'type' 속성이 있으며 μ„ νƒμ μœΌλ‘œ redux μ €μž₯μ†Œμ— 일뢀 데이터λ₯Ό λ³΄λ‚΄λŠ” 데 μ‚¬μš©λ˜λŠ” 'payload' 속성을 κ°€μ§ˆ μˆ˜λ„ μžˆλ‹€.
REDUCER
μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœμ˜ λ³€κ²½ 사항을 κ²°μ •ν•˜κ³  μ—…λ°μ΄νŠΈλœ μƒνƒœλ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 인수둜 쑰치λ₯Ό μ·¨ν•˜κ³  store λ‚΄λΆ€μ˜ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•œλ‹€.
Redux Store
이듀을 ν•˜λ‚˜λ‘œ λͺ¨μœΌλŠ” 객체 μ €μž₯μ†ŒλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 μƒνƒœ 트리λ₯Ό λ³΄μœ ν•œλ‹€. λ‚΄λΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” μœ μΌν•œ 방법은 ν•΄λ‹Ή μƒνƒœμ— λŒ€ν•œ Action을 μ „λ‹¬ν•˜λŠ” 것이닀. Redux StoreλŠ” ν΄λž˜μŠ€κ°€ μ•„λ‹ˆλ©° λͺ‡ 가지 Methodsκ°€ μžˆλŠ” 객체일 뿐이닀.

- Provider

Redux μŠ€ν† μ–΄λ₯Ό React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ œκ³΅ν•˜λŠ” μ΅œμƒμœ„ μ»΄ν¬λ„ŒνŠΈμ΄λ‹€. Providerλ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  ν•˜μœ„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ Redux μŠ€ν† μ–΄μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹€. ProviderλŠ” React Redux λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•œλ‹€.
✍ Provider μ˜ˆμ‹œ μ½”λ“œ
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';

ReactDOM.render(
<Provider store={store}>
  <App />
</Provider>,
document.getElementById('root')
);

- useSelector

Redux μŠ€ν† μ–΄μ—μ„œ μƒνƒœλ₯Ό μ„ νƒν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 훅이며 useSelector ν•¨μˆ˜λŠ” μ…€λ ‰ν„°(selector) ν•¨μˆ˜λ₯Ό 전달받아 μŠ€ν† μ–΄μ—μ„œ ν•„μš”ν•œ μƒνƒœλ₯Ό μ„ νƒν•œλ‹€. 이 ν•¨μˆ˜λŠ” μƒνƒœλ₯Ό λ°˜ν™˜ν•œλ‹€.
✍ useSelector μ˜ˆμ‹œ μ½”λ“œ
import { useSelector } from 'react-redux';

function MyComponent() {
 const count = useSelector(state => state.count);
 return <div>{count}</div>;
}

- useDispatch

Redux μ•‘μ…˜μ„ λ°œμƒμ‹œν‚€λŠ” 데 μ‚¬μš©λ˜λŠ” 훅이며useDispatch ν•¨μˆ˜λŠ” dispatch ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€. 이 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•‘μ…˜ 객체λ₯Ό μƒμ„±ν•˜κ³  dispatch ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ μ•‘μ…˜μ„ λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€.
✍ useDispatch μ˜ˆμ‹œ μ½”λ“œ
import { useDispatch } from 'react-redux';
import { increment } from './actions';

function MyComponent() {
  const dispatch = useDispatch();
  const handleClick = () => {
    dispatch(increment());
  };
  return <button onClick={handleClick}>Increment</button>;
}
profile
Brendan Eich, Jordan Walke, Evan You, κΆŒμš©μ€€

0개의 λŒ“κΈ€