3 minute read

배열 내장함수 filter?

  • 메모를 작성해서 추가하는 기능까지 완료했다면 이번에는 메모를 삭제하는 기능을 구현해보겠습니다. 메모 삭제기능을 구현 할 떄는 배열 내장함수인 filter 를 사용합니다. filter 함수는 기존의 배열은 그대로 둔 상태에서 특정 조건을 만족하는 원소들만 따로 추출하여 새로운 배열을 만들어 주는 기능이 있습니다.
    const array = [1,2,3,4,5,6,7,8,9,10];
    const biggerThanFive = array.filter(number => number > 5);

    // 결과 [6,7,8,9,10]

위의 코드를 보면 배열에 1부터 10까지 담은 후 filter 를 이용해 5 보다 큰 숫자만 베열에 담아 출력합니다. 단 filter 함수에는 조건을 확인해 주는 함수를 파라미터로 넣어 주어야 합니다. 파라미터로 넣는 함수는 true 나 false 로 값을 반환해야하며 true를 반환하는 경우만 새로운 배열에 포함됩니다.

항목 지우기_1 (App.js)

  • filter 함수를 사용하여 App.js에 onRemove 함수를 작성해줍니다. App.js 에 id를 파라미터로 받아온 후 같은 id를 가진 항목을 todos 배열에서 지우는 함수입니다. React 삽질하기
      import React, { useState } from 'react';
      import './App.css';
      import TodoTemplate from './components/TodoTemplate';
      import TodoInsert from './components/ToddInsert';
      import TodoList from './components/TodoList';
    
      const App = () => {
      const [todos, setTodos] = useState([
          {
          id: 1,
          text: '리액트 기초 알아보기',
          checked: true,
          },
          {
          id: 2,
          text: '컴포넌트 스타일링 해보기',
          checked: true,
          },
          {
          id: 3,
          text: '일정 관리 앱 만들어보기',
          checked:false,
          }
      ])
    
      const onRemove = useCallback(
          id => {
              setTodos(todos.filter(todo => todo.id !== id));
          },
          [todos],
      );
    
      return (
          <>
          <TodoTemplate>
              <TodoInsert />
              <TodoList todos={todos} />
          </TodoTemplate>
          </>
      );
      }
    
      export default App;
    

항목 지우기_2 (TodoList.js/TodoListItem.js)

  • 다음으로 할 일은 App.js에서 만든 onRemove 함수를 사용하기 위해 TodoList에 코드를 추가해줍니다. onRemove 함수를 사용하기 위해선 TodoList 를 거쳐얃 하기 때문입니다. 아래와 가이 props로 받아온 onRemove 함수를 TodoListItem에 그대로 전달해 줍니다. React 삽질하기
      import React from "react";
      import TodoListItem from './TodoListItem';
      import './Todo.css';
    
      const TodoList = ({todos, onRemove}) => {
          return (
              <div className="TodoList">
                  {todos.map(todo => (
                      <TodoListItem todo={todo} key={todo.id} onRemove={onRemove} />
                  ))}
                  {/* <TodoListItem/>
                  <TodoListItem/>
                  <TodoListItem/> */}
              </div>
          );
      };
    
      export default TodoList;
    

React 삽질하기

    import React from "react";
    import {MdRemoveCircleOutline, MdCheckBoxOutlineBlank, MdCheckBox } from 'react-icons/md';
    import cn from 'classnames';    
    import './Todo.css';

    // import './TodoListItem.scss';
    const TodoListItem = ({ todo, onRemove }) => {
        const { id,text,checked } = todo;
        return(
            <div className="TodoListItem">
                <div className={cn(`checkbox`, { checked })}>
                    {checked ? <MdCheckBox /> : <MdCheckBoxOutlineBlank />}
                    {/* <MdCheckBoxOutlineBlank /> */}
                    <div className="text">{text}</div>
                </div>
                <div className="remove" onClick={() => onRemove(id)}>
                    <MdRemoveCircleOutline />
                </div>
            </div>
        );
    };

    export default TodoListItem;
  • 위와 같이 코드를 작성한 후 확인을 하면 할 일 매모에서 삭제버튼을 눌렀을 때 메모가 정상적으로 삭제되는 것을 확인할 수 있습니다.

항목 체크하기_1(App.js)

  • 다음으로 구현할 기능은 항목 체크기능입니다. 체크기능의 경우 삭제 기능과 매우 비슷합니다. 아래와 같이 코드를 작성해주세요. React 삽질하기
      import React, { useState , useRef, useCallback } from 'react';
      import './App.css';
      import TodoTemplate from './components/TodoTemplate';
      import TodoInsert from './components/TodoInsert';
      import TodoList from './components/TodoList';
    
      const App = () => {
      const [todos, setTodos] = useState([
          {
          id: 1,
          text: '리액트 기초 알아보기',
          checked: true,
          },
          {
          id: 2,
          text: '컴포넌트 스타일링 해보기',
          checked: true,
          },
          {
          id: 3,
          text: '일정 관리 앱 만들어보기',
          checked:false,
          }
      ])
    
      const nextId = useRef(4);
    
      const onInsert = useCallback(
          text => {
          const todo = {
              id: nextId.current,
              text,
              checked: false,
          };
    
          setTodos(todos.concat(todo));
          nextId.current += 1;      // nextId +1씩 증가
          },
          [todos],
      )
    
      const onRemove = useCallback(
          id => {
          setTodos(todos.filter(todo => todo.id !== id));
          },
          [todos],
      )
    
      const onToggle = useCallback(
          id => {
          setTodos(todos.map(todo => todo.id === id ? {...todo, checked: !todo.checked} : todo, ),);
          },
          [todos],
      )
      return (
          <>
          <TodoTemplate>
              <TodoInsert onInsert={onInsert}/>
              <TodoList todos={todos} onRemove={onRemove} onToggle={onToggle}/>
          </TodoTemplate>
          </>
      );
      }
    
      export default App;
    
  • 체크 코드에서는 배열 내장함수 map 을 사용하여 특정 id값을 가지고 있는 객체의 checked 값을 반전시켜줍니다.

항목 체크하기_2(TodoListItem.js/TodoList.js)

  • 다음에는 삭제 기능처럼 TodoListItem에서 사용할 수 있도록 TodoList 를 거쳐가도록 코드를 추가해줍니다. React 삽질하기
      import React from "react";
      import TodoListItem from './TodoListItem';
      import './Todo.css';
    
      const TodoList = ({todos, onRemove, onToggle}) => {
          return (
              <div className="TodoList">
                  {todos.map(todo => (
                      <TodoListItem todo={todo} key={todo.id} onRemove={onRemove} onToggle={onToggle}/>
                  ))}
                  {/* <TodoListItem/>
                  <TodoListItem/>
                  <TodoListItem/> */}
              </div>
          );
      };
    
      export default TodoList;
    

React 삽질하기

    import React from "react";
    import {MdRemoveCircleOutline
        , MdCheckBoxOutlineBlank
        , MdCheckBox } from 'react-icons/md';
    import cn from 'classnames';    
    import './Todo.css';

    // import './TodoListItem.scss';
    const TodoListItem = ({ todo, onRemove, onToggle }) => {
        const { id,text,checked } = todo;
        return(
            <div className="TodoListItem">
                <div className={cn(`checkbox`, { checked })} onClick={() => onToggle()}>
                    {checked ? <MdCheckBox /> : <MdCheckBoxOutlineBlank />}
                    {/* <MdCheckBoxOutlineBlank /> */}
                    <div className="text">{text}</div>
                </div>
                <div className="remove" onClick={() => onRemove(id)}>
                    <MdRemoveCircleOutline />
                </div>
            </div>
        );
    };

    export default TodoListItem;
  • 여기까지 작성하고나면 간단하게 할 일 메모 기능의 구현이 완료됩니다. 일단은 개인 공부할 겸 기록해놓는 포스팅이다보니 모든 내용이 책과 동일하며.. 아직까지 자세한 설명은 할 자신이 없습니다… 아주 많이 공부한 후에 직접 다양한 기능을 구현하도록 하겠습니다… 감사합니다!

Tags:

Categories:

Updated:

Comments