❗️해당 게시물은 별코딩 useReducer강의를 수강하고 작성한 게시물입니다.
현재 컴포넌트가 아닌 다른 곳에 state를 저장하고 싶을 때 유용하다.
state
와 action
인자를 받는다. const [state, dispatch] = useReducer(reducer, initialState)
❗️자세한 코드는 아래 Veloperty blog 참고
Veloperty useReducer 사용방법
function reducer(state, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
throw new Error('Unhandled Action')
}
}
useReducer
에선 일반적으로 default:
부분에 throw new Error('Unhandled Action')
과 같이 에러를 발생시키도록 처리하는게 일반적이다.
import React, {useState, useReducer} from 'react';
//useReducer도 useState와 똑같이 state가 바뀔 때 마다
//컴포넌트를 렌더링 해준다.
const ACTION_TYPES = {
deposit : 'deposit',
withdraw : 'withdraw',
}
const reducer = (state, action) => {
console.log('reducer가 일을 합니다!',state, action);
switch(action.type){
case ACTION_TYPES.deposit:
return state + action.payload;
case ACTION_TYPES.withdraw:
return state - action.payload;
default :
return state;
}
}
//reducer호출 되는 시점에 state는 money라는 state가 들어가게 된다.
function App(){
const [number, setNumber] = useState(0);
const [money, dispatch] = useReducer(reducer, 0);
//첫번째 인자 - Reducer 두번째 인자 - 초기값
return(
<div>
<h2>useReducer 은행에 오신것을 환영합니다.</h2>
<p>잔고 : {money}원</p>
<input
type = "number"
value = {number}
onChange = {(e)=> setNumber(parseInt(e.target.value))}
step="1000"
/>
<button onClick={()=>{
dispatch({type : ACTION_TYPES.deposit, payload : number});
//action은 object 형태로 해준다.
}}>예금</button>
<button onClick={()=>{
dispatch({ type:ACTION_TYPES.withdraw, payload : number});
}}>출금</button>
</div>
)
}
export default App;