그럼 이제 onToggle, onRemove 함수에서 useState의 함수형 업데이트를 사용해 볼까요? 이 과정에서 onInsert 함수도 함께 수정하겠습니다.
App.js
import React, { useRef, useState, useCallback } from 'react'; import TodoTemplate from './components/TodoTemplate'; import TodoInsert from './components/TodoInsert'; import TodoList from './components/TodoList'; function createBulkTodos() { const array = []; for (let i = 1; i <= 2500; i++) { array.push({ id: i, text: `할 일 ${i}`, checked: false, }); } return array; } const App = () => { const [todos, setTodos] = useState(createBulkTodos); // 고윳값으로 사용될 id // ref를 사용하여 변수 담기 const nextId = useRef(4); const onInsert = useCallback(text => { const todo = { id: nextId.current, text, checked: false, }; setTodos(todos => todos.concat(todo)); nextId.current += 1; // nextId 1씩 더하기 }, []); const onRemove = useCallback(id => { setTodos(todos => todos.filter(todo => todo.id != = id)); }, []); const onToggle = useCallback(id => { setTodos(todos => todos.map(todo => todo.id === id ? { ...todo, checked: !todo.checked } : todo, ), ); }, []); return ( <TodoTemplate> <TodoInsert onInsert={onInsert} /> <TodoList todos={todos} onRemove={onRemove} onToggle={onToggle} /> </TodoTemplate> ); }; export default App;