728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ์ค๋์ redux ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ์กฐ์ ๋ฒํผ์ ๋ง๋ค์ด๋ณด์๋ค.
- ๋ค๋ง ์ง๊ธ์ reducer() ์ 0๋ฒ ์ธ๋ฑ์ค์ ํด๋นํ๋ 1๋ฒ ์ํ๋ง + ๋ฒํผ๊ณผ - ๋ฒํผ์ผ๋ก ์๋ ์กฐ์ ์ด ๊ฐ๋ฅํ๊ฒ๋ ํด๋์ด์ ๋ค๋ฅธ ์ํ๋ค์ ์๋ ์กฐ์ ์ด ๋ถ๊ฐํ๋ค.
- ํ๋ผ๋ฏธํฐ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ ์๋ ์์๊น ๊ณ ๋ฏผํด๋ณด๊ณ ์ฝ๋๋ฅผ ์์ ํด๋ณด์์ง๋ง ์์ง redux ์ ๋ํ ๊ณต๋ถ๊ฐ ๋ถ์กฑํด์์ธ์ง ๋ง์ฒ๋ผ ๋์ง๋ ์์๋ค.
- ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์ฐ๋ฉด์ ๊ตฌ๊ธ๋งํด๋ณด๊ณ ๋์ค์ ๋ค์ ํด๋ด์ผ๊ฒ ๋ค.
๐ redux ๋ฅผ ์ฌ์ฉํ์ฌ state ๋ฐ์ดํฐ ์์ ํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
- reducer ํจ์๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
- ์ํ๋ ์์น์์ dispatch() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ reducer ์ ์์ ํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ค.
๐ ์ฅ๋ฐ๊ตฌ๋ ํ๋ชฉ ์๋ ์กฐ์ ๋ฒํผ ๋ง๋ค๊ธฐ
- ์๋ ์ด์ ํด๋นํ๋ ํ๋ง๋ค + / - ๋ฒํผ์ ํ๋์ฉ ๋ง๋ค์ด์ ๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น ์ํ์ ์๋์ด 1์ฉ ์ฆ๊ฐ ํน์ ๊ฐ์ํ๋๋ก ๋ง๋ค์ด๋ณด์๋ค.
๐ค ์๋ ์กฐ์ ๋ฒํผ UI ๋ง๋ค๊ธฐ
let ChangeNum = styled.button`
border: 1px solid lightgrey;
border-radius : 5px;
margin: 0 15px;
width: 25px;
`
- button ํ๊ทธ๋ฅผ ๋ง๋ค์ด์ css ๋ก ๊พธ๋ฏธ๋ ๊ฒ๋ณด๋ค styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ธํ๋ ๊ฒ ํธํด์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ChangeNum ์ด๋ผ๋ Component ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
<td>
<ChangeNum>+</ChangeNum>
{item.quan}
<ChangeNum>-</ChangeNum>
</td>
- + ๋ฒํผ๊ณผ - ๋ฒํผ์ ๋์ผํ ๋์์ธ์ด์ด์ผ ํ๋ฏ๋ก ๋ ๋ค <ChangeNum></ChangeNum> ์ผ๋ก ๊ฐ์ธ์ฃผ์๋ค.
๐ค reducer ์ ํ ํ๊ธฐ
// ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ
function reducer(){
return [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
]
}
let store = createStore(reducer);
- ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ์ reducer ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
- reducer ๋ state ์ด๊ธฐ๊ฐ๊ณผ state ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ์ด ๋ค์ด์๋ ํจ์์ ํํ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ธฐ์กด์ createStore() ์์ ๋ค์ด์๋ ๋ฐ์ดํฐ๋ฅผ reducer() ๋ก ์ฎ๊ฒจ์ return ํ๋๋ก ๋ง๋๋ ๊ฒ์ธ๋ฐ, ๋ณ ๊ธฐ๋ฅ์ ์์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ์ ํ ์๋ฃ์ด๋ค.
// ๋๋ฒ์งธ ๋ฐฉ๋ฒ
let defaultState = [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
];
function reducer(state = defaultState, action){
return state
}
let store = createStore(reducer);
- ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฐ๋ก defaultState ์ ๊ฐ์ด state ๋ณ์๋ฅผ ๋ง๋ค์ด์ค ๋ค์, ๊ทธ๊ฑธ reducer() ์ default ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ์ผ๋ก ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
- ์ฐธ๊ณ ๋ก default ํ๋ผ๋ฏธํฐ ๋ฌธ๋ฒ์ด๋ ํจ์๋ฅผ ๋ง๋ค ๋, ์ค์ ํน์ ์๋์ ์ผ๋ก ํ๋ผ๋ฏธํฐ ์ ๋ ฅ์ ํ์ง ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ์ผ๋ก ๊ฐ์ง ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ผ๋ก, ํ๋ผ๋ฏธํฐ ์ ์ธํ ๋ ๋ฑํธ(=)์ ํจ๊ป ๊ธฐ๋ณธ๊ฐ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
๐ค reducer ์ ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ ์ ์ํ๊ธฐ
let defaultState = [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
];
function reducer(state = defaultState, action){
if (action.type === 'plus') {
return (๊ธฐ์กด ๊ฐ์ +1 ๋ ์๋ก์ด state);
} else if (action.type === 'minus') {
return (๊ธฐ์กด ๊ฐ์ -1 ๋ ์๋ก์ด state);
} else {
return state;
}
}
let store = createStore(reducer);
- reducer ์ ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ์ ์์ ๊ฐ์ด ์ ์ํด๋ณด์๋ค.
- ๋จผ์ , plus ๋ผ๋ ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ ์ด๋ฆ์ ํ๋ ์ง์ด์ค๋ค.
(์ด๋ ๋์ค์ action.type === ์์ ๋ฐฉ๋ฒ_์ด๋ฆ ๊ณผ ๊ฐ์ ํํ๋ก ์ฌ์ฉํ๋๋ฐ, ๋์ ๊ฒฝ์ฐ 'plus', 'minus' ๋ก ์ด 2๊ฐ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค. ) - if ๋ฌธ ์์๋ 'plus' ๋ผ๋ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ์๋ ์ด๋ค state ๋ฅผ return ํ ์ง, 'minus' ๋ผ๋ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ์๋ ์ด๋ค state ๋ฅผ return ํ ์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ ์ด๋ค state ๋ฅผ return ํ ์ง ์์ฑํด์ฃผ๋ฉด ๋๋ค.
- ๋จผ์ , plus ๋ผ๋ ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ ์ด๋ฆ์ ํ๋ ์ง์ด์ค๋ค.
<td>
<ChangeNum onClick={ ()=>{ props.dispatch({ type : 'plus' }) } }>+</ChangeNum>
{item.quan}
<ChangeNum onClick={ ()=>{ props.dispatch({ type : 'minus' }) } }>-</ChangeNum>
</td>
- ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค๋ฉด ์ด์ ๋ฒํผ์ ๋๋ ์ ๋, ํน์ ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ์ ์คํํ ์ ์๋๋ก onClick ์์ฑ์ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋๋ฐ, ์ด ๋ dispatch() ๋ฅผ ์ฌ์ฉํ์ฌ html ์์์ reducer() ๋ฅผ ๋์์ํฌ ์ ์๋ค.
- ๊ทธ๋์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด + ๋ฒํผ์ ๋๋ฅผ ๋๋ plus ๋ผ๋ state ์์ ๋ฐฉ๋ฒ์ด ๋์ํ๊ณ , - ๋ฒํผ์ ๋๋ฅผ ๋๋ minus ๋ผ๋ state ์์ ๋ฐฉ๋ฒ์ด ๋์ํ๋ค.
๐ค reducer ์ฝ๋ ์์ฑํ๊ธฐ
let defaultState = [
{ id : 1, name : 'Red Knit', quan : 2 },
{ id : 0, name : 'White and Black', quan : 1 },
{ id : 3, name : 'Flowey', quan : 3 }
];
function reducer(state = defaultState, action){
if (action.type === 'plus') {
let newState = [...state];
newState[0].quan++;
return newState;
} else if (action.type === 'minus') {
if (newState[0].quan > 0) {
newState[0].quan--;
}
return newState;
} else {
return state;
}
}
let store = createStore(reducer);
- ์ฐ์ , ์ฒซ๋ฒ์งธ ํ๋ชฉ๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ง ์์ ์ด ๋๋๋ก ๋ง๋ค์ด๋ณด์๋ค.
- array ์๋ฃํ์ด๋ object ์๋ฃํ์ state ๋ฅผ ์์ ํ๊ธฐ ์ํด์๋ ๊น์ ๋ณต์ฌ๋ฅผ ํ ์ฌ๋ณธ์ ๋ง๋๋ ๊ฒ ์ค์ํ๋ค.
- ๋ฐ๋ผ์, action.type ์ด plus ์ธ ๊ฒฝ์ฐ์ state ์ ์ฌ๋ณธ์ธ newState ๋ฅผ ๋ง๋ ํ์ newState ์ ์ฒซ๋ฒ์งธ ํ๋ชฉ์ธ 0๋ฒ ์ธ๋ฑ์ค์ ์๋์ธ quan ์ +1 ์ฒ๋ฆฌํด์ฃผ๊ณ ์์ ์ฌํญ์ด ๋ฐ์๋ newState ๋ฅผ return ํด์ฃผ์๋ค.
- action.type ์ด minus ์ธ ๊ฒฝ์ฐ์๋, action.type ์ด plus ์ธ ๊ฒฝ์ฐ์ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
- ๋ค๋ง, ์ฐ์ํ์ฌ - ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์ซ์๊ฐ ์์๊ฐ ๋๋ฏ๋ก ์ซ์๊ฐ 0 ๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ง -1 ์ ํด์ฃผ๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_4 (0) | 2022.03.29 |
---|---|
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_3 (0) | 2022.03.29 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.28 |
[React] Tab ๋ง๋ค๊ณ ์ ๋๋ฉ์ด์ ์ถ๊ฐํ๊ธฐ (0) | 2022.03.27 |
[React] props ๋์ Context API ์ฌ์ฉํด๋ณด๊ธฐ (1) | 2022.03.27 |