728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
๐ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธฐ
- ์ค๋์ redux ๋ฅผ ์ด์ฉํ์ฌ ํน์ ์ํ์ ์์ธ ํ์ด์ง์์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋๋๊ณ , ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์๋ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ํด๋ฆญํ๋ ์ํ์ด ์ถ๊ฐ๋์ด ๋ณด์ฌ์ง๊ฒ ํด๋ณด์๋ค.
- ๋ค๋ง, ์ด๋ฏธ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์ํ์ ์ถ๊ฐ ์ฃผ๋ฌธํ๋ฉด ํ์ด ์๋ก ๋ง๋ค์ด์ง๋ ๊ฒ ์๋๋ผ ์๋๋ง ์ถ๊ฐ๋์ด์ผ ํ๋๋ฐ ์ด ๋ถ๋ถ์ ์์ง ๋ฏธ์์ฑ์ด๋ผ ์กฐ๋ง๊ฐ ์์ ์ ํด๋ณด๋ ค๊ณ ํ๋ค.
๐ ์๋ ์กฐ์ ๋ฒํผ ๊ธฐ๋ฅ ์์ ํ๊ธฐ
- ์ง๋๋ฒ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ์๋ ์กฐ์ ๋ฒํผ ๊ธฐ๋ฅ์ ๋ง๋ค ๋, dispatch ํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ๋ฒ์ ๋ชฐ๋ผ์ ์ฒซ๋ฒ์งธ ํญ๋ชฉ๋ง ๊ธฐ๋ฅ์ด ์๋ํ๋๋ก ํ๋์ฝ๋ฉ์ ํ์๋ค.
- ๊ทธ๋์ ์ด๋ฒ ์์ ๋ด์ฉ์ ํ์ฉํ๋ฉด ์๋ ์กฐ์ ๋ฒํผ ๊ธฐ๋ฅ๋ id ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ ์์ ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์์ ๋ง๋ค์ด๋ณด์๋ค.
๐ ์์ธ ํ์ด์ง์์ ์ฃผ๋ฌธํ๊ธฐ ํด๋ฆญํ๋ฉด ์ฅ๋ฐ๊ตฌ๋์ ๋ด๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
๐ค "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ UI ๋ง๋ค๊ธฐ
<button className="btn btn-danger mx-1">์ฃผ๋ฌธํ๊ธฐ</button>
- "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ Bootstrap ์ ์ด์ฉํ์ฌ ์ด์ ์ ์ด๋ฏธ ๋ง๋ค์ด๋์๋ค.
๐ค "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
let defaultData = [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
]
- ๋ธ๋ผ์ฐ์ ์์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ ์ ๋ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง ๋ชฉ๋ก์ ํ๋ชฉ์ด ์ถ๊ฐ๋์ด ๋ณด์ฌ์ง๊ฒ ํ๊ธฐ ์ํด์๋, "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ onClick ์์ฑ์ ํ์ฉํ์ฌ ์ defaultData ์ object ํํ๋ก ์์ธ ํ์ด์ง์ ํ๋ชฉ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
1. reducer ์ ๋ฐ์ดํฐ ์์ ํ๋ ๋ฐฉ๋ฒ ์ ์ํ๊ธฐ
function reducer(state = defaultData, action) {
if (action.type === 'addItem') {
let item = action.payload.findId;
let newState = [...state];
newState.push({
id : item.id,
name : item.title,
quan : 1
})
return newState;
} else if (action.type === 'plus') {
let id = action.payload;
let newState = [...state];
newState[id].quan++;
return newState;
} else if (action.type === 'minus'){
let id = action.payload;
let newState = [...state];
if (newState[id].quan > 0) {
newState[id].quan--;
}
return newState;
} else {
return state;
}
}
- ์ง๋ ๋ฒ์ + / - ๋ฒํผ ๊ธฐ๋ฅ์ ๋ง๋ค ๋ ์ฌ์ฉํ๋ reducer ์๋ค๊ฐ ์ด๋ฒ์๋ 'addItem' ์ผ๋ก if ๋ฌธ์ ์ถ๊ฐ์์ฑํด์ฃผ์๋ค.
- ์ฝ๋๋ฅผ ํด์ํ์๋ฉด, 'addItem' ์ด๋ผ๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด newState ๋ผ๋ defaultData ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด์ฃผ๊ณ ์ฌ๊ธฐ์ ์ ์ก๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด๋ฌ๋ผ๋ ๊ฒ์ด๋ค.
2. dispatch ์ฌ์ฉํ๊ธฐ
<button className="btn btn-danger mx-1" onClick={()=>{props.dispatch({ type : 'addItem' })}}>์ฃผ๋ฌธํ๊ธฐ</button>
- ์ด์ Detail.js ํ์ผ์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ 'addItem' ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น if ๋ฌธ ์์ ์ฝ๋๋ฅผ ์คํํด๋ฌ๋ผ๊ณ ์์ฒญํด์ฃผ๋ dispatch ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
function Store(state) {
return {
data : state.reducer,
alert : state.reducer2
}
}
export default connect(Store)(Detail);
- ๊ทธ๋ฆฌ๊ณ dispatch ๋ฅผ ์ฌ์ฉํ ๋์๋ ๊ผญ ํ๋จ์ state ๋ฅผ props ๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์์ export default connect() ๋ฅผ ์ถ๊ฐํด์ฃผ์!
3. dispatch ํ ๋ ๋ฐ์ดํฐ ์ค์ด๋ณด๋ด๊ธฐ
<button className="btn btn-danger mx-1" onClick={()=>{
props.dispatch({ type : 'addItem', payload : { findId } });
history.push('/cart');
}}>์ฃผ๋ฌธํ๊ธฐ</button>
- dispatch ํ ๋, ์์ type ์ธ์ payload ๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด์ฃผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ค.
(payload ๋ง๊ณ ๋ค๋ฅธ ์ด๋ฆ์ ์ฌ์ฉํด๋ ๋์ง๋ง, ๊ด์ต์ ์ผ๋ก payload ๋ฅผ ์ฌ์ฉํ๋ค.) - ๋๋ ์ฌ๊ธฐ์ ๊ธฐ์กด์ ์์ธ ํ์ด์ง ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ์ํด ์ฌ์ฉํ๋ findId ๋ฅผ ๋ด์ redux ๋ก ์ ์กํด์ฃผ์๋ค.
- ๊ทธ๋ฆฌ๊ณ history.push('/cart') ๋ผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ดํ์ ๋ฐ๋ก ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋ํ ์ ์๊ฒ ํด์ฃผ์๋ค.
4. ์ ์กํ ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ ๋ฐ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๊ธฐ
- redux ๋ก ์ ์กํ ๋ฐ์ดํฐ๋ reducer ํจ์ ์์์ action.payload ๋ผ๊ณ ์ฝ์์ ์ถ๋ ฅํด๋ณด๋ฉด ์์ ๊ฐ์ด ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
- ๋์ ๊ฒฝ์ฐ 0๋ฒ ์ํ์ ์์ธ ํ์ด์ง์์ "์ฃผ๋ฌธํ๊ธฐ" ๋ฒํผ์ ๋๋ฌ payload ์ findId ๋ฅผ ์ ์กํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด 0๋ฒ ์ํ์ ๋ด์ฉ์ด ๋ด๊ธด findId ๊ฐ ์ถ๋ ฅ๋์๋ค.
- ์ด์ ์ด๋ ๊ฒ ์ ์ก๋ฐ์ ๋ฐ์ดํฐ ๋ด์ฉ์์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฝ์๋ด๋ ๊ฒ์ด ์ค์ํ๋ฐ, ์์ธ ํ์ด์ง ๋ด์ฉ์ ๊ธฐ์กด defaultData ๋ด์ ์๋ object ์๋ฃํ๊ณผ ํต์ผ์ํจ ํ ์ถ๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
// ๊ธฐ์กด์ ๊ฐ ๋ฐ์ดํฐ๋ id, title, content, price ๋ก ๊ตฌ์ฑ
// findId ์ ๋ด๊ธด ๋ฐ์ดํฐ๋ ์ด ํ์์ ์ง๋
{
id : 0,
title : "White and Black",
content : "Born in France",
price : 120000
}
// ์ถ๊ฐํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ id, name, quan ์ผ๋ก ๊ตฌ์ฑ
{ id : 1, name : 'Red Knit', quan : 2 }
- findId ๋ฅผ ํตํด ์ ์ก๋ฐ์ ๋ฐ์ดํฐ๋ id, title, content, price ๋ก ๊ตฌ์ฑ๋ ๋ฐ๋ฉด, ์ ์ฅ๋์ด์ผํ๋ ๋ฐ์ดํฐ ํํ๋ id, name, quan ์ผ๋ก ๊ตฌ์ฑ๋์ด์ผํ๋ค.
// reducer ๋ด์ 'addItem' ์์ฒญ ๊ด๋ จ if ๋ฌธ
if (action.type === 'addItem') {
let item = action.payload.findId;
let newState = [...state];
newState.push({
id : item.id,
name : item.title,
quan : 1
})
return newState;
}
- ๋ฐ๋ผ์ payload ๋ฅผ ํตํด ๋ฐ์์จ findId ๋ฅผ item ์ด๋ผ๋ ๋ณ์์ ์ ์ฅํ์ฌ, newState ์ push ํด์ค ๋ id ์๋ item.id, name ์๋ item.title, quan ์๋ 1์ ๋ฃ์ด์ฃผ์๋ค.
- ๊ทธ๋ ๊ฒ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋ ํ return ๋ newState ๋ Cart.js ํ์ผ์์ props.data ๋ก ๋ฐ์ map() ํจ์๋ฅผ ๊ฑฐ์ณ ๋ธ๋ผ์ฐ์ ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ํ์๋๋ ๊ฒ์ด๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] localStorage ๋ก DB ์์ด ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ (0) | 2022.03.31 |
---|---|
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_5 (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 |