-
immerJavascript/React.js 2020. 5. 6. 22:42
immer
객체의 구조가 엄청나게 깊어지면 불변성을 유지하기 어려워진다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters//somewhere.deep.array에 5 추가하기 let nextObject = { ...object, somewhere: { ...object.somewhere, deep: { ...object.somewhere.deep, array: object.somewhere.deep.array.concat(5) } } }; 위와 같이 값 하나를 업데이트하기 위해 코드를 열 줄 정도 작성해야 한다. 이럴 때, immer라는 라이브러리를 사용하면 매우 쉽고 짧은 코드로 불변성을 유지할 수 있다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersimport React, { useRef, useCallback, useState } from 'react'; // immer 라이브러리에 produce 메서드를 사용 import produce from 'immer'; const App = () => { const nextId = useRef(1); const [form, setForm] = useState({name : '', username : ''}); const [data, setData] = useState({ array: [], uselessValue: null }); const onChange = useCallback( e => { const {name, value} = e.target; setForm( // state를 변경할 때, produce 함수를 사용한다. // 변경할 데이터를 첫 번째 파라미터에 넣고 // 두 번째 파라미터로 arraw function을 넣는다. produce(form, draft => { draft[name] = value; }) ); },[form] ); const onSubmit = useCallback( e => { e.preventDefault(); const info = { id: nextId.current, name: form.name, username: form.username }; setData( // produce는 배열을 새로 만들지 않고 직접 제어해도 무방하다. produce(data, draft => { draft.array.push(info); }) ); setForm({ name:'', username:'' }); nextId.current += 1; }, [data, form.name, form.username] ); const onRemove = useCallback( id => { setData( produce(data, draft => { draft.array.splice(draft.array.findIndex(info => info.id === id), 1); })); }, [data] ); return( <div> <form onSubmit={onSubmit}> <input name="username" placeholder="ID" value={form.username} onChange={onChange}> </input> <input name="name" placeholder="NAME" value={form.name} onChange={onChange}> </input> <button type="submit">submit</button> </form> <div> <ul> {data.array.map(info => ( <li key={info.id} onClick={() => onRemove(info.id)}>{info.username} ({info.name})</li> ))} </ul> </div> </div> ); }; export default App; 위의 예시와 같이 사용하면 불변성에 신경 쓰지 않으면서 관리할 수 있다.
'Javascript > React.js' 카테고리의 다른 글
외부 API를 연동해 뉴스 뷰어 만들기 (0) 2020.05.12 SPA (0) 2020.05.11 최적화 방법 (0) 2020.05.06 chrome 개발자 도구를 통한 성능 모니터링 (0) 2020.05.06 컴포넌트 스타일링 (0) 2020.05.04