이러한 immer의 속성과 useState의 함수형 업데이트를 함께 활용하면 코드를 더욱 깔끔하게 만들 수 있습니다. App을 다음과 같이 수정해 보세요.
App.js
import React, { useRef, useCallback, useState } from 'react'; import produce from 'immer'; const App = () => { const nextId = useRef(1); const [form, setForm] = useState({ name: '', username: '' }); const [data, setData] = useState({ array: [], uselessValue: null }); // input 수정을 위한 함수 const onChange = useCallback(e => { const { name, value } = e.target; setForm( produce(draft => { draft[name] = value; }) ); }, []); // form 등록을 위한 함수 const onSubmit = useCallback( e => { e.preventDefault(); const info = { id: nextId.current, name: form.name, username: form.username }; // array에 새 항목 등록 setData( produce(draft => { draft.array.push(info); }) ); // form 초기화 setForm({ name: '', username: '' }); nextId.current += 1; }, [form.name, form.username] ); // 항목을 삭제하는 함수 const onRemove = useCallback( id => { setData( produce(draft => { draft.array.splice(draft.array.findIndex(info => info.id === id), 1); }) ); }, [] ); return (...); }; export default App;
produce 함수의 파라미터를 함수 형태로 사용하니 코드가 더욱 깔끔해졌습니다.