728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- reducer ๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ด๋ค ์์ผ๋ก redux ๋ฅผ ํ์ฉํด์ผํ๋์ง ์์๋ณด๊ธฐ ์ํด ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ์๋ฆผ์ฐฝ UI ๋ฅผ ํ๋ ๋ง๋ค์ด๋ณด์๋ค.
- ํ์ง๋ง ์ด๋ ๊ฒ ํ๋์ Component ์๋ง ์ฌ์ฉํ state ๋ฐ์ดํฐ๋ผ๋ฉด redux ์ ๊ตณ์ด ์ ์ฅํ ํ์๊ฐ ์์ด useState() ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ๊ณ ๊ฐ๋จํ๋ค๋ ๊ฒ๋ ์๊ฒ ๋์๋ค.
- ์ด๋ฒ์๋ reducer ๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์์ฑํ๋์ง ๋ฐฐ์ฐ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ๊ธดํ์ง๋ง, ๋ณต์ตํ๋ฉด์ useState() ๋ฅผ ์ฌ์ฉํ ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ ์์ ์ด๋ค.
๐ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ์๋ฆผ์ฐฝ ๋ง๋ค๊ธฐ
- ์ ๊ท๊ฐ์ ํ๋ฉด ์ต๋ 20% ํ ์ธ ์ฟ ํฐ์ ์ ๊ณตํ๋ค๋ ์๋ฆผ์ฐฝ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง ํ๋จ์ ๋์ฐ๊ณ ๋ซ๊ธฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์๋ค.
๐ค ์๋ฆผ์ฐฝ UI ๋ง๋ค๊ธฐ
let Alert = styled.div`
background: #eee;
max-width: none;
font-weight: bold;
color: red;
font-size : 20px;
padding: 15px 20px;
`
- ์ฐ์ styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ Alert Component ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
<Alert>
<span className='me-3'>์ ๊ท๊ฐ์
์ ์ต๋ 20% ํ ์ธ ์ฟ ํฐ ์ ๊ณต!</span>
<button className='btn btn-outline-danger'>๋ซ๊ธฐ</button>
</Alert>
- ์ ๊ท๊ฐ์ ํ๋ ๊ฒฝ์ฐ ์ต๋ 20% ํ ์ธ ์ฟ ํฐ์ ์ ๊ณตํ๋ค๋ ๋ด์ฉ์ ์์ฑํ ํ Bootstrap ์ ํ์ฉํ์ฌ ๊ฐ๋จํ ๋ ์ด์์์ ์ก์์ฃผ๊ณ <Alert></Alert> ๋ก ๊ฐ์ธ์ฃผ์๋ค.
๐ค reducer ํ๋ ๋ ๋ง๋ค๊ธฐ
- useState() ๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง reducer ๊ฐ ์ฌ๋ฌ ๊ฐ ํ์ํ ์ํฉ์ ์ฐ์ถํ๊ธฐ ์ํด redux ์ state ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด๋ณด์๋ค.
- ์๋ฆผ์ฐฝ์ ๋ณด์ด๋๋ก ํน์ ์ ๋ณด์ด๋๋ก ์ค์ ํด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ true / false ๋ฅผ state ์ ์ ์ฅํ๋ฉด ๋๋ค.
- ๊ทธ๋ผ ์ด๋์ ์ ์ฅํ๋๋๊ฐ ๋ฌธ์ ๊ฐ ๋๋๋ฐ ์ผ๋ฐ์ ์ธ Component ์์ state ๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํ๋ฉด useState() ๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฏ, redux ์์๋ reducer ๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
let defaultAlert = true;
function reducer2(state = defaultAlert, action) {
if (action.type === 'close') {
state = false;
return state;
} else {
return state;
}
}
- reducer ๋ฅผ ํ๋ ๋ ๋ง๋ค ๋์๋ state ์ด๊ธฐ๊ฐ๊ณผ reducer, ์ด๋ ๊ฒ ํ ์์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
(๊ทธ๋์ ๋๋ defaultAlert ๋ผ๋ state ์ด๊ธฐ๊ฐ๊ณผ, reducer2 ๋ผ๋ reducer ๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.) - ์ฝ๋๋ฅผ ์ ๊น ํด์ํ์๋ฉด ๋จผ์ ์๋ฆผ์ฐฝ์ด ๋ณด์ด๋ ๊ฒ์ true, ์ ๋ณด์ด๋ ๊ฒ์ false ๋ก ์ ํ ํ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ์ ์ํ์ ๋๋ ์๋ฆผ์ฐฝ์ด ๋ณด์ฌ์ผ ํ๋ฏ๋ก ์ด๊ธฐ๊ฐ์ true ๋ผ๊ณ ์ค์ ํด์ฃผ์๋ค.
- ๋ซ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ์ ๋(action.type ์ด 'close'), state ์๋ false ๊ฐ ์ ์ฅ๋ ํ์ return ๋๊ณ ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ๊ธฐ๋ณธ ์ํ๋ก return ํ๊ฒ ํด์ฃผ์๋ค.
let store = createStore(combineReducers({ reducer, reducer2 }));
- ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ด์ ์ ๋ง๋ค์ด๋์๋ store ์ reducer2 ๋ฅผ ์ถ๊ฐ๋ก ๋ฑ๋กํด์ฃผ๋ฉด ๋๋ค.
- ๋จผ์ , combineReducers() ๋ผ๋ ํจ์๋ฅผ redux ๋ก๋ถํฐ import ํด์ค๋ค.
- ๊ทธ ๋ค์์ createStore() ์์ combineReducers() ๋ฅผ ์ฌ์ฉํ์ฌ, ์ด์ ์ ๋ง๋ค๊ณ ์ฌ์ฉํ reducer ์ ์ด๋ฒ์ ๋ง๋ค์ด์ค reducer2 ๋ฅผ object ํ์์ผ๋ก ๋ด์์ฃผ๋ฉด ๋๋ค.
๐ค reducer ์ฌ์ฉํ๊ธฐ
// reducer ๊ฐ ํ๋์์ ๋
function Store(state) {
return {
state : state;
}
}
// reducer ๊ฐ ๋ ๊ฐ์ผ ๋
function Store(state) {
return {
data : state.reducer,
alert : state.reducer2
}
}
- reducer ๊ฐ ํ๋์ผ ๋์ ๋ฌ๋ฆฌ 2๊ฐ ์ด์์ผ ๋์๋ state ์์ { reducer : [ ], reducer2 : [ ] ... } ์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ๋ฐ๋ผ์, state ๋ฅผ props ๋ก ์ ์ฅํ ๋ state.reducer ๋ data ๋ก, state.reducer2 ๋ alert ๋ก ์ ์ฅํด์ฃผ์๋ค.
๐ค ์๋ฆผ์ฐฝ ๋ซ๊ธฐ ๋ฒํผ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
{
props.alert === true ? (
<Alert>
<span className='me-3'>์ ๊ท๊ฐ์
์ ์ต๋ 20% ํ ์ธ ์ฟ ํฐ ์ ๊ณต!</span>
<button className='btn btn-outline-danger' onClick={ ()=>{ props.dispatch({ type : 'close' }) } }>๋ซ๊ธฐ</button>
</Alert>
) : null
}
- ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ์ ์ก๋ฐ์์จ props.alert ๊ฐ true ๋ผ๋ฉด ์๋ฆผ์ฐฝ์ ๋ณด์ฌ์ฃผ๊ณ , false ๋ผ๋ฉด ์๋ฆผ์ฐฝ์ด ์๋ณด์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ซ๊ธฐ ๋ฒํผ์ onClick ์์ฑ์ ๋ฃ์ด, ๋ซ๊ธฐ ๋ฒํผ ํด๋ฆญ ์ action.type ์ด 'close' ๊ฐ ๋์ด(์ด ๊ณผ์ ์์ state ๊ฐ false ๋ก ๋ฐ๋๋ค.) ์๋ฆผ์ฐฝ์ด ์ ๋ณด์ด๋๋ก ํด์ฃผ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_5 (0) | 2022.03.29 |
---|---|
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_4 (0) | 2022.03.29 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ_2 (0) | 2022.03.28 |
[React] props ๋์ redux ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2022.03.28 |
[React] Tab ๋ง๋ค๊ณ ์ ๋๋ฉ์ด์ ์ถ๊ฐํ๊ธฐ (0) | 2022.03.27 |