728x90
Custom Hook
코드를 작성하다 보면 반복되는 로직을 재사용 해야하는 상황에서 custom hook 을 만들어서 관리 할 수 있다
input 값을 작성하는 경우에 여러 폼에서 그 로직이 반복될 수 있기 때문에 해당 커스텀 훅을 만들어서 사용
- 주로 input 값 작성, fetch 호출 시에 자주 사용된다
- 항상 use로 시작해야한다.
//custom hook
function useInputs(initialForm){//initialForm : form에서 사용할 초기값
const [ form, setForm] = useState(initialForm);
const onChange = useCallback(e =>{
const {name, value} = e.target;
setForm(form => ({...form, [name] : value}));
}, [])
const reset = useCallback(()=>
setForm(form => ({ ...form, [name]: value }));
return [form, onChange, reset] //객체나 배열 둘다 return 이 가능
}
const initialState = {
users:[
{
id: 1,
username: 'hj',
email: 'hj1@hj.com',
active:true,
},
{
id: 2,
username: 'hj2',
email: 'hj2@hj.com',
active:false,
},
{
id: 3,
username: 'hj3',
email: 'hj3@hj.com',
active:false,
}
]
}
function App() {
const [form, onChange, reset] = useInputs({
username:'',
email:'',
})
const {username, email} = form
const onCreate = useCallback(()=>{
dispatch({
type:'CREATE_USER',
user:{
id:nextId.current,
username,
email
}
})
nextId.current+=1
reset()
}, [username, email, reset ]) //reset은 넣어주지 않아도 되지만 useCallback 에서 사용하고 있으므로 esLint 문법상 넣어야 한다
}
useReducer로 바꿔서 해보기 숙제
: 생각보다 혼자하려니 쉽지않다.. 지금은 강의만 듣고 혼자 지난 부분을 복습하는 정도로 진행해보고 있는데
혼자 더 많은 코드를 작성해봐야 될듯 싶다.
import { useState, useReducer, useCallback} from 'react';
function reducer(state, action){
switch(action.type){
case 'CHANGE':
return {
...state,
// inputs:{
// ...state.inputs,
[action.name]: action.value
// }
};
//숙제 오답 inputs 객체가 필요없기 때문에 해당 부분을 작성하지 않고 바로 대입해줘도 됨[action.name]: action.value
case 'RESET':
return Object.keys(state).reduce((acc, current) => {
acc[current] = '';
return acc;
}, {});
//숙제 오답 : 모든 state 값을 빈값으로 만들어 주면되므로 반복문을 사용해서 존재하는 모든 key 값을 초기화
}
}
//custom hook
function useInputs(initialForm){//form에서 사용할 초기값
const [state , dispatch] = useReducer(reducer, initialForm)
const onChange = useCallback(e =>{
const {name, value} = e.target;
dispatch({
type:'CHANGE',
name,
value
})
}, [])
const reset = useCallback(()=>
dispatch({
type:'RESET',
// initialForm
//오답 : initialForm은 필요없음 그 대신 deps에 [] 을 널어줘야함
}), []
)
return [state, onChange, reset]
}
export default useInputs;
728x90
반응형
'Frontend > React.js' 카테고리의 다른 글
React - jsx(JavaScript Xml) (0) | 2022.12.13 |
---|---|
리액트 - immer (0) | 2022.11.03 |
리액트 - useReducer (0) | 2022.10.22 |
리액트 - useMemo, useCallback, React.memo 알아보기 (0) | 2022.10.20 |
리액트 배열 추가, 삭제, 수정 (0) | 2022.10.05 |