useReducer๋ ๋ฌด์์ผ๊น?
useReducer๋ ๋ฆฌ์กํธ์์ ์ ๊ณตํ๋ ์ํ๊ด๋ฆฌ๋ฅผ ์ํ ํ ์ ๋๋ค. useState์๋ ๋ค๋ฅธ ์ํ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์ด ์ฅ์ ์ธ๋ฐ์. ์ด ํ ์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ์์ ๋ถ๋ฆฌ์ํฌ ์ ์๋๊ฒ ์ฅ์ ์ ๋๋ค. ๋ค๋ฅธ ํ์ผ์ ์์ฑ ํ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
useReducer์ ๊ตฌ์ฑ์์
const reducer = (state,action) => {
}
const initialState = {
}
function App(){
const [state,dispatchFn] = useReducer(reducer,initialState);
//์ดํ์๋ต..
}
useReducer๋ reducer ํจ์์ ์ด๊ธฐ๊ฐ์ธ initialState๋ฅผ ์ธ์๋ก ๋ฐ์์ผ ํฉ๋๋ค. reducer๋ ์ํ๊ฐ ๋ฐ๋๋ ๊ณณ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๊ณ initialState๋ ๋ง๊ทธ๋๋ก ์ด๊ธฐ ์ํ๋ฅผ ์ ์ฅํด๋์ ๊ฒ์ ๋๋ค. reducerํจ์๋ state์ action์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ต๋๋ค. action์ ํตํด ์ํ๊ฐ ์ด๋ป๊ฒ ๋ฐ๋์์ผ๋ฉด ์ข๊ฒ ๋์ง ์ ํ ์ ์์ผ๋ฉฐ state์๋ ํ์ฌ์ ์ํ๊ฐ ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค. dispatchFn์ ์ปดํฌ๋ํธ ์์์ ์ฐ์ด๋ฉฐ reducer์์ ํน์ ๋์์ ์ํํ ์ ์๋๋ก ๋ช ๋ นํ๊ณ ์ธ์๋ฅผ ๋๊ธฐ๋ ์ญํ ์ ์ํํฉ๋๋ค.
๊ทธ๋ผ ์๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ์ฝ๊ฒ ์ดํดํ ์ ์์๊น์?
reducerํจ์ ๋ด์์ action์ ๋ฐ๋ฅธ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง์ด ์์ต๋๋ค. ๊ณ ๊ฐ์ ๊ทธ์ ์ฐฝ๊ตฌ์ธ dispatch๋ฅผ ํตํด action์ ์๋ ค์ฃผ๋ฉด ์ํ ์ฅ๋ถ(state)๊ฐ ํ๊ณ์ง์์ด ๋ง๋ ์ ์ฐจ์ ๋ฐ๋ผ(reducerํจ์) ์ ๋ฐ์ดํธ ๋๋ ๊ฒ์ ๋๋ค.
๊ฐ๋จํ Counter์์ ๋ก useReducer์์๋ณด๊ธฐ
import React,{useReducer} from 'react';
const reducer = (state,action) => {
if(action === 'plus'){
return state+1;
}
else if(action === 'minus'){
return state-1;
}
}
export function App(props) {
const [count, dispatch] = useReducer(reducer,0);
const onPlus = () => {
dispatch('plus')
}
const onMinus = () =>{
dispatch('minus')
}
return (
<div className='App'>
<h1>Count: {count}</h1>
<button onClick={onPlus}>+</button>
<button onClick={onMinus}>-</button>
</div>
);
}
// Log to console
console.log('Hello console')
์ปดํฌ๋ํธ์์์๋ ๊ทธ์ dispatch์์ ๋ช ๋ น์ ํ๋ ๋ฃ๊ณ ํธ์ถํด์ฃผ๋ฉด ์ํ๊ฐ ๋ฐ๋๋๋ค. ์ด๋ ๋งค์ฐ ๊ฐ๋จํ ์์ ๋ผ useReducer์ ์ฅ์ ์ด ๋ค์ด๋ ๋ณด์ด์ง ์์ง๋ง ์ํ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ณ ์๋ก ๋ค๋ฅธ ์ํ๋ค์ด ์๋ก์ ๋ณํ์ ์ํฅ์ ์ฃผ๊ณ ๋ฐ๋ ๋ณต์กํ ์ํฉ์ด ์๊ธธ์์(ํนํ๋ ๋น๋๊ธฐ์) useReducer๋ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ธ์ ์ฐ๋๊ฒ Best์ผ๊น?
ํ๋ก๊ทธ๋๋ฐ์์ ์ ๋ต์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ์ค ์ ๋ง ์ ๋งคํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ ๋ง์ ๊ธฐ์ค์ด ์๋ค๋ฉด ๊ทธ๋๋ก ์ ์ฉํ๋ฉด ๋๋๊ฒ ์ฐ์ ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
https://react.vlpt.us/basic/20-useReducer.html
์ ๊ธ์ ์ฐธ๊ณ ํด๋ณด์๋ฉด ์ฐ์ ๋ถ๊ป์๋ ์ํ๊ฐ ์ฌ๋ฌ๊ฐ์ด๊ณ , setter๋ฅผ ํ ํจ์์์ ์ฌ๋ ค๋ฒ ์ฌ์ฉํด์ผ ํ๋ ์ผ์ด ๋ฐ์ํ๋ค๋ฉด useReducer์ ์ฉ์ ๋ํ ๊ณ ๋ฏผ์ ํ์ ๋ค๊ณ ํฉ๋๋ค.
๋ ์๋ฉด ์ข์ ๋ด์ฉ
const validatePasswordHandler = () => {
// setPasswordIsValid(enteredPassword.trim().length > 6);
dispatchPassword({ type: "INPUT_BLUR" });
};
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ์ ๋ฐ๋ฏธ ๋ฆฌ์กํธ ๊ฐ์์์ ๊ฐ์ ธ์จ ๋ด์ฉ์ธ๋ฐ ์ํ๋ฅผ setter๋ก ์ ๋ฐ์ดํธ ํ ๋ ๋ค๋ฅธ ์ํ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ์๋ ์์ต๋๋ค.(์์์ ์ฃผ์์ฒ๋ฆฌ ํ ๋ถ๋ถ) ๊ทธ ๋ค๋ฅธ ์ํ๋ผ๋ ๊ฒ์ด ์ต์ ๊ฐ์ด ์๋ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ฐ์ ์ํ๋ผ๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ์ฐ๊ฒ ์ง๋ง ๋ค๋ฅธ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ง๋ ๋ชปํฉ๋๋ค. ๋งค์ฐ ๋๋ฌธ ์ผ์ด์ค์ด์ง๋ง ๋น๋๊ธฐ๋ก ์ฝ๋๊ฐ ๋์๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด, ์ฆ, setter๋ฅผ ํตํด ์ํ๋ฅผ ๋ฐ๊พธ๋ ค๋์ค์ ์ฐธ์กฐํ๋ ๋ค๋ฅธ ์ํ๊ฐ์ด ๋ฐ๋๊ณ ๊ทธ๊ฒ ์ ์ฉ๋์ด์ผ ํ๋ค๋ฉด ์ ์ฉ๋์ง ์์ ๊ฒ์ ๋๋ค. ์ด๋ ์ํ๋ฅผ ํ๋๋ก ๊ด๋ฆฌํ๋ฉด ํด๊ฒฐํ ์ ์์ ๊ฒ์ ๋๋ค.
'react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[react] useReducer ํ ์ ๋ํด ์์๋ณด์ Feat. ์ ๋ฐ๋ฏธ ๋ฆฌ์กํธ ๊ฐ์ (0) | 2023.10.11 |
---|---|
๊ฐ๋ฐ๋ชจ๋์์ useEffect๊ฐ 2๋ฒ ์คํ๋๋ ๊ฒฝ์ฐ (0) | 2023.08.30 |
[React] ๋ฆฌ์กํธ์์ TypeScript๋ฅผ ์ธ ๋ ํ์ํ ๊ฒ (feat. useState) (0) | 2023.08.03 |
[React] react-query ์ useQuery ์์๋ณด๊ธฐ (0) | 2023.08.01 |
[React] Styled-components ์ฌ์ฉ๋ฒ๊ณผ ์ ์ฉํ ๊ธฐ๋ฅ๋ค (0) | 2023.07.28 |