그럼 이제 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;

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.