728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ด๋ฒ์๋ props ๋ฅผ ๋์ ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ธ redux ์ ๋ํด์ ์กฐ๊ธ ๊ณต๋ถํด๋ณด์๋ค.
- ์์ง๊น์ง๋ ๋ด๊ฐ ๋ง๋ ํ๋ก์ ํธ๊ฐ ํ์ Component ๊ฐ ๋ณ๋ก ์๋ค๋ณด๋ props ๋ณด๋ค ํธํ์ง์ ๋ํด ๋ ผํ๊ธฐ๋ ์ด๋ ต๊ธด ํ๋ค.
- ๋ง์ง๋ง redux ์์ ๊น์ง ์ ๋ค์ด์ ์ผ๋ฌด์ง๊ฒ ์จ๋จน์ด์ผ๊ฒ ๋ค.
๐ props ๋์ ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ ์ฐพ์๋ณด๊ธฐ
- props ๋ฅผ ๋์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Context API ๋ Redux ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ์ด์ ์๋ Context API ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ผ๋ฏ๋ก, ์ด๋ฒ์๋ Redux ๋ฅผ ์ด์ฉํด๋ณด์๋ค.
- ์ฌ์ค, React ๋ฅผ ์ด์ฉํ ์ค์ ์ฌ์ดํธ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ redux ๋ฅผ ์ค์นํ์ฌ ์ฌ์ฉํ๋ ๊ณณ์ด ์ข ๋ ๋ง๋ค.
๐ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง ๋ง๋ค๊ธฐ
๐ค ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ํ ๋ ์ด์์ ์ถ๊ฐํ๊ธฐ
<div>
<Table responsive>
<thead>
<tr>
<th>#</th>
<th>์ํ๋ช
</th>
<th>์๋</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>์ํ๋ช
</td>
<td>์๋</td>
</tr>
<tr>
<td>2</td>
<td>์ํ๋ช
</td>
<td>์๋</td>
</tr>
<tr>
<td>3</td>
<td>์ํ๋ช
</td>
<td>์๋</td>
</tr>
</tbody>
</Table>
</div>
- Cart.js ํ์ผ์ ์์ฑํ ๋ค Cart Component ๋ฅผ ๋ง๋ค์ด์ ์ผ๋ฐ์ ์ธ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ฒ๋ผ ํ ๋ ์ด์์์ ์ถ๊ฐํด์ฃผ์๋ค.
- ๋น ๋ฅธ ๋ ์ด์์ ๋์์ธ์ ์ํด ํ ๋ ์ด์์์ React Bootstrap ์ table ์ ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐํ ํ ์์ ์ ํด์ฃผ์๋ค.
๐ค ๋ผ์ฐํฐ ์ค์ ํ๊ธฐ
// ์ฝ๋ ์ ์ฒด ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import Cart from './Cart';
function App() {
return (
<div className="App">
<Switch>
<Route path='/cart'>
<Cart />
</Route>
</Switch>
</div>
);
}
- ์ด์ ๊ธฐ์กด์ ๋ผ์ฐํฐ๋ฅผ ์ค์ ํด์ฃผ๋ ๋ถ๋ถ์ผ๋ก ๊ฐ์ /cart ๋ผ๋ ๊ฒฝ๋ก๋ก GET ์์ฒญ์ ๋ณด๋ด๋ฉด Cart Component ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ์ค์ ํด์ฃผ์๋ค.
- ๋ฌผ๋ก Cart.js ํ์ผ์์ Cart Component ๋ฅผ export ํด์ฃผ๊ณ App.js ํ์ผ์์ import ํด์ผํ๋ค๋ ์ ์์ง ๋ง์!
- ์ฌ๊ธฐ๊น์ง ์๋ฃํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ /cart ๋ก ์ ์ํ๋ฉด Cart Component ๊ฐ ๋ณด์ธ๋ค.
๐ redux ์ค์น ํ ์ ํ ํ๊ธฐ
- ์ด์ ์๋ ์ต์์ ํ์ผ์ state ๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ props ๋ก ์ ์ก๋ฐ์๋ค๋ฉด, ์ด๋ฒ์๋ redux ๋ฅผ ์ด์ฉํด์ ๋ณด๊ดํด๋ณด์๋ค.
๐ค redux ์ค์นํ๊ธฐ
// npm ์ ์ด์ฉํ ๋
npm install redux react-redux
// yarn ์ ์ด์ฉํ ๋
yarn add redux react-redux
- Redux ๋ฅผ ์ด์ฉํ๋ ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ 2๊ฐ(redux, react-redux) ์ค์นํด์ฃผ์ด์ผ ํ๋ค.
- redux ๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- react-redux ๋ Redux ๋ฅผ React ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๋ฐ๋ผ์ ์ ์ฝ๋ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ํฐ๋ฏธ๋์ ์ ๋ ฅํด์ฃผ๋ฉด 2๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋๋ค.
๐ค redux ์ ํ ํ๊ธฐ
// ์ฝ๋ ์ ์ฒด ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import {Provider} from 'react-redux'; // 1๋จ๊ณ
import { createStore } from 'redux'; // 3๋จ๊ณ
let store = createStore(()=>{ // 3๋จ๊ณ
return [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
]
});
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>
<Provider store={store}> // 2๋จ๊ณ, 4๋จ๊ณ
<App />
</Provider>
</BrowserRouter>
</React.StrictMode>
);
- redux ๋ฅผ ์ด์ฉํ ๊ฐ๋ฐํ๊ฒฝ์ ์
ํ
ํ๋ ค๋ฉด index.js ํ์ผ์์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- 1๋จ๊ณ : Provider ๋ฅผ react-redux ๋ก๋ถํฐ import ํ๋ค.
- 2๋จ๊ณ : state ๊ฐ์ ๊ณต์ ํ๊ณ ์ ํ๋ Component ๋ฅผ <Provider></Provider> ๋ก ๊ฐ์ธ์ค๋ค.
(๋์ ๊ฒฝ์ฐ, App Component ๋ฅผ ๊ฐ์ธ์ฃผ์ด App Component ์๋ง ์๋๋ผ ๊ทธ ์์ ๋ชจ๋ HTML, Component ์์ state ๋ฅผ props ์ ์ก ์์ด ์ง์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ์๋ค.) - 3๋จ๊ณ : redux ์์ createStore() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ state ๋ฅผ ํ๋ ๋ง๋ ๋ค.
(createStore ๋ฅผ redux ๋ก๋ถํฐ import ํ ๋ค์, createStore() ์์ state ์ด๊ธฐ๊ฐ์ผ๋ก ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ฐฑํจ์์ ํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.) - 4๋จ๊ณ : <Provider> ์ state ๋ฅผ props ์ฒ๋ผ ๋ฑ๋กํ๋ค.
๐ redux ์ ์ ์ฅํ state ๋ฐ์ดํฐ ๊บผ๋ด์ฐ๊ธฐ
- ์์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ redux ์ ์ ์ฅํ๋ค๋ฉด Cart.js ํ์ผ์์ state ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ธ ์ ์๋ค.
- ์ฆ, ์ด์ Cart Component ๋ด์ Table Component ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๊ทธ๋ฌ๊ธฐ ์ํด์๋ store ๋ผ๋ ๋ณ์๋ช ์ผ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ props ์ ํํ๋ก ๋ฑ๋กํด์ผ ํ๋ค.
๐ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ Component ๊ฐ ์๋ JavaScript ํ์ผ ํ๋จ์ ํจ์ ๋ง๋ค๊ธฐ
function Store(state) {
return {
state : state
}
}
- ์ด ํจ์๋ store ์์ ์๋ state ๋ฅผ props ๋ก ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
- return ์์ { ๋ณ์๋ช : ๋ฐ์์จ_state } ์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด store ์์ ์๋ ๋ชจ๋ state ๋ฐ์ดํฐ๊ฐ props ๋ก ๋ฑ๋ก๋๋ค.
- ๋ฌผ๋ก ํ์ํ state ๋ง { ๋ณ์๋ช : ๋ฐ์์จ_state.name } ๊ณผ ๊ฐ์ ํํ๋ก ๋ฐ์์ props ๋ก ๋ฑ๋กํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๐ค export default ๋ค์ connect ํจ์ ๋ฃ๊ธฐ
import { connect } from 'react-redux';
- ์ผ๋จ ์์ ๊ฐ์ด react-redux ์์ connect() ํจ์๋ฅผ import ํด์จ๋ค.
- ํ๋จ์์ export default connect()() ํํ๋ก export default ๋ฌธ์ ์์ฑํ๋ค๋ณด๋ฉด ์๋์ผ๋ก import ๋๊ธฐ๋ ํ๋ค.
export default connect(Store)(Cart);
- ์ด์ ์ด์ ์ Cart component ๋ฅผ export ํ๊ธฐ ์ํด ์์ฑํ๋ ์ฝ๋์ธ export default Cart ๋ฅผ ์์ ํด์ฃผ์ด์ผ ํ๋ค.
- connect() ํจ์์ ์๊น ๋ง๋ Store ํจ์๋ฅผ ์ง์ด ๋ฃ์ด์ค ๋ค์, Cart Component ๋ ์๊ดํธ ์์ ์ง์ด๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
- ๋ฐ๋ผ์, ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด redux store ์ ์๋ ๋ฐ์ดํฐ๋ค์ด props ๋ก ์ฎ์ธ ์ฑ๋ก Component ๊ฐ export ๋๋ ๊ฒ์ด๋ค.
๐ค props ์ฒ๋ผ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ
function Cart(props) {
return(
<div>
<Table responsive>
<thead>
<tr>
<th>#</th>
<th>์ํ๋ช
</th>
<th>์๋</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>props.state[0].name</td>
<td>props.state[0].quan</td>
</tr>
<tr>
<td>2</td>
<td>props.state[1].name</td>
<td>props.state[1].quan</td>
</tr>
<tr>
<td>3</td>
<td>props.state[2].name</td>
<td>props.state[2].quan</td>
</tr>
</tbody>
</Table>
</div>
)
}
- ์ด์ props ์ฒ๋ผ ์ฌ์ฉ์ ํ๋ ค๋ฉด, Cart Component ์ props ๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ์ฌ Store() ํจ์์์ state ๋ผ๋ ๋ณ์๋ช ์ผ๋ก ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด ๋๋ค.
๐ map ํจ์๋ฅผ ์ด์ฉํ์ฌ ํ์ฅ์ฑ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ
// ์ฝ๋ ์ ์ฒด ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
<Table responsive>
<thead>
<tr>
<th>#</th>
<th>์ํ๋ช
</th>
<th>์๋</th>
</tr>
</thead>
<tbody>
{
props.state.map((item, idx)=>{
return (
<tr key={idx}>
<td>{ idx + 1 }</td>
<td>{item.name}</td>
<td>{item.quan}</td>
</tr>
)
})
}
</tbody>
</Table>
- ๊ฐ์๋ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ผ๋ก ๋๋ฌ์ง๋ง.. ์ญ์ ํ๋์ฝ๋ฉ๋ ๊ฒ์ ๊ทธ๋๋ก ๋๊ณ ๋ณผ ์๋ ์์๋ค!
- ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ง๋ค๋ฉด ํ์ฅ์ฑ์ ์ ๊ทธ๋ ์ด๋ํ ์ ์์ผ๋ฏ๋ก map ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ ํ์๋ค.
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ํ์ฅ์ฑ์ด ์ข์์ง ๊ฑธ ๋ณด๋ ๋ง์์ด ํ์จํด์ก๋ค.
- ๋ง์ง๋ง์ผ๋ก div ๋ฐ์ค๋ง ์กฐ๊ธ ๋ ์์๊ฒ ์์ ํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_3 (0) | 2022.03.29 |
---|---|
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_2 (0) | 2022.03.28 |
[React] Tab ๋ง๋ค๊ณ ์ ๋๋ฉ์ด์ ์ถ๊ฐํ๊ธฐ (0) | 2022.03.27 |
[React] props ๋์ Context API ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2022.03.27 |
[React] ์์ธ ํ์ด์ง์ ์ฌ๊ณ ๋ฐ์ดํฐ ํ์ํ๊ธฐ (0) | 2022.03.26 |