728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ๊ธฐ์กด์ ์์ฑํ๋ state ๋ฅผ props ๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์ ๋ฐ export default connect()() ๋ ์๋์ ์ผ๋ก ์์ ์ ์ฐ์ด๋ ๋ฐฉ์์ด์ง๋ง ํ์ ์์ ์ฝ๋๋ฅผ ์ฝ์ด๋ผ ์ ์์ด์ผ ํ๋ฏ๋ก ์ด์ ์์ ์ ํตํด ๋ฐฐ์๋ณด์๋ค.
- ์ด๋ฒ์๋ useSelector() ์ useDispatch() ๋ฅผ ์ด์ฉํ์ฌ ํจ์ฌ ๋ ์ฝ๊ณ ๊ฐ๋ตํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์๋ค.
- ์์ ์ ๋ฐฐ์ด ๊ฒ๋ค์ ํ์ฉํ์ฌ ๋ค๋ฅธ ํ์ผ์๋ ์ ์ฉํด๋ณด์๋ค.
๐ ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ ์ฒด ์ฝ๋์ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
import { useDispatch, useSelector } from 'react-redux';
function Cart(props) {
let state = useSelector((state)=>state);
let dispatch = useDispatch();
return(
<CartContainer>
<Table responsive>
<thead>
<tr>
<th>#</th>
<th>์ํ๋ช
</th>
<th>์๋</th>
</tr>
</thead>
<tbody>
{
state.reducer.map((item, idx)=>{
return (
<tr key={idx}>
<td>{ idx + 1 }</td>
<td>{item.name}</td>
<td>
<ChangeNum onClick={ ()=>{ dispatch({ type : 'plus' , payload : idx }) } }>+</ChangeNum>
{item.quan}
<ChangeNum onClick={ ()=>{ dispatch({ type : 'minus', payload : id : idx }) } }>-</ChangeNum>
</td>
</tr>
)
})
}
</tbody>
</Table>
{
state.reducer2 === true ? (
<Alert>
<span className='me-3'>์ ๊ท๊ฐ์
์ ์ต๋ 20% ํ ์ธ ์ฟ ํฐ ์ ๊ณต!</span>
<button className='btn btn-outline-danger' onClick={ ()=>{ dispatch({ type : 'close' }) } }>๋ซ๊ธฐ</button>
</Alert>
) : null
}
</CartContainer>
)
}
export default Cart;
๐ useSelector
- redux store ์ ์ ์ฅ๋์ด์๋ state ๋ฅผ ๊บผ๋ด์ด ์ฌ์ฉํ๊ธฐ ์ํด์๋ state ๋ฅผ props ๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์๋ฅผ ์ถ๊ฐํ๊ณ export default connect()() ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์ด์ ์์ ๊น์ง ๊ณต๋ถํ๋ค.
- ์ฌ์ค ์ด๊ฒ์ ์๋ ๋ฐฉ์์ด๋ฉฐ ์์ฆ์๋ useSelector ๋ผ๋ Hook ์ ์ฌ์ฉํด์ ๋ ์ฝ๊ฒ state ๋ฅผ ๊บผ๋ด์ด ์ฌ ์ ์๋ค.
๐ค useSelector ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
function Store(state) {
return {
data : state.reducer,
alert : state.reducer2
}
}
export default connect(Store)(Cart);
- ์ด์ ์๋ ์์ ๊ฐ์ด state ๋ฅผ props ๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์(์ ์ฝ๋์ Store() ํจ์)์ export default connect()() ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด์ ํจ์๋ ์ง์์ฃผ๋ฉด ๋๋ค.
export default Cart;
- ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ค์ export default ์ฝ๋๋ connect() ๋์ ๊ทธ๋ฅ Component ์ด๋ฆ์ธ Cart ๋ก ๋ฐ๊พธ์ด์ค๋ค.
import { useDispatch, useSelector } from 'react-redux';
function Cart(props) {
let state = useSelector((state)=>state);
let dispatch = useDispatch();
return(
<CartContainer>
// ์๋ต
</CartContainer>
)
}
export default Cart;
- ์ด์ useSelector() ๋ผ๋ ํจ์๋ฅผ import ํ ๋ค์, useSelector() ์์ ์ฝ๋ฐฑํจ์๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ state ๋ผ๋ ๋ณ์์ ์ ์ฅํด์ค๋ค.
- ์ด ๋, ์ฝ๋ฐฑํจ์ ์์๋ ํ๋ผ๋ฏธํฐ ํ๋๋ง ์
๋ ฅ ๊ฐ๋ฅํ๋ฐ ์ด๋ ์๋์ผ๋ก reducer ๋ค์ ํฉ์น store ๊ฐ ๋๋ค.
((state) => state ๋ผ๊ณ ์์ฑํ๋ฉด state ๋ค์ state ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ state ๋ก ์ ์ฅํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ฉฐ ๋ ์ธ๋ถ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.) - ์ด์ ๊ธฐ์กด์ ์ฝ๋๋ค ์ค ์์ ์ด ํ์ํ ๋ถ๋ถ์ ์์ ํด์ฃผ๋ฉด ๋๋ค.
(์๋ฅผ ๋ค์ด, props.data.map~ ๋ถ๋ถ์ state.reducer.map~ ์ด๋ฐ ์์ผ๋ก...)
๐ useDispatch
๐ค useDispatch ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
import { useDispatch, useSelector } from 'react-redux';
function Cart(props) {
let state = useSelector((state)=>state);
let dispatch = useDispatch();
return(
<CartContainer>
// ์๋ต
</CartContainer>
)
}
export default Cart;
- useDispatch() ๋ผ๋ ํจ์๋ฅผ import ํ ๋ค์, useDispatch() ๋ฅผ dispatch ๋ผ๋ ๋ณ์์ ์ ์ฅํด์ค๋ค.
- ๊ทธ๋ฌ๋ฉด ๊ธฐ์กด์ props.dispatch() ๋ก state ์์ ์์ฒญ์ ํ๋ ๊ฒ์ dispatch() ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํด์ง๋ค.
- ์ด์ ๊ธฐ์กด์ ์ฝ๋๋ค ์ค ์์ ์ด ํ์ํ ๋ถ๋ถ์ ์์ ํด์ฃผ๋ฉด ๋๋ค.
(์๋ฅผ ๋ค์ด, props.dispatch() ๋ถ๋ถ์ dispatch() ์ด๋ฐ ์์ผ๋ก...)
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] localStorage ๋ก DB ์์ด ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ (0) | 2022.03.31 |
---|---|
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_4 (0) | 2022.03.29 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_3 (0) | 2022.03.29 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_2 (0) | 2022.03.28 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.28 |