[React #28] ToDo List - Read

    반응형

    📌리스트 읽어오기

    App.jsx에서 List 컴포넌트에 props로 todos 리스트를 전달하고,

    List.jsx → TodoItem.jsx에서 받기

    List.jsx

    import TodoItem from './TodoItem';
    
    function List({ todos }) {
      return (
        <div className='List'>
          <h4>ToDo List ☘️</h4>
          <input placeholder='검색어를 입력해 주세요.' />
          <div className='todos_warpper'>
            {todos.map((todo) => {
              return <TodoItem {...todo} key={todo.id} />;
            })}
          </div>
        </div>
      );
    }
    
    export default List;
    • map()  이용해서 배열에 담긴 값을 리스트 형태로 반복적으로 렌더링 해줌
    • map은 배열의 모든 요소에 대해서 콜백 함수를 실행한 뒤 리턴한 반환 값들을 새로운 배열로 반환함
    • todo에 담긴 모든 값을 props로 전달하기 위해 스프레드 연산자로 모든 데이터를 전달해줌
    • 리스트 형태로 렌더링된 컴포넌트들은 서로를 구분하기 위해서 각각의 key라는 고유한 값이 있어야 함

    TodoItem.jsx

    function TodoItem({ content, date, isDone }) {
      return (
        <div className='TodoItem'>
          <input type='checkbox' checked={isDone} />
          <div className='content'>{content}</div>
          <div className='date'>{new Date(date).toLocaleDateString()}</div>
          <button>삭제</button>
        </div>
      );
    }
    
    export default TodoItem;
    • List.jsx로부터 전달받은 props를 기반으로 서로 다른 UI를 렌더링할 수 있음
    • 날짜는 새로운 객체로 생성하고, toLocaleDateString() 이용해서 날짜 포맷을 변경함

    📌리스트 검색하기

    List.jsx에서 입력한 값과 동일한 리스트만 보여주기

    List.jsx

    import { useState } from 'react';
    import TodoItem from './TodoItem';
    
    function List({ todos }) {
      const [search, setSearch] = useState('');
      const onSearch = (e) => {
        setSearch(e.target.value);
      };
      const getFilteredData = () => {
        if (search === '') {
          return todos;
        }
        return todos.filter((todo) =>
          todo.content.toLocaleLowerCase().includes(search.toLocaleLowerCase())
        );
      };
      const filteredData = getFilteredData();
      return (
        <div className='List'>
          <h4>ToDo List ☘️</h4>
          <input
            onChange={onSearch}
            value={search}
            placeholder='검색어를 입력해 주세요.'
          />
          <div className='todos_warpper'>
            {filteredData.map((todo) => {
              return <TodoItem {...todo} key={todo.id} />;
            })}
          </div>
        </div>
      );
    }
    
    export default List;
    • search를 state로 생성하여, input 값이 변경될 때마다 search의 값을 저장함
    • getFilterData를 생성하여,  search의 값이 없다면 그대로 배열을 반환함
    • 그게 아니라면  filter() 이용해서 배열의 모든 아이템을 순회해 연산의 값이 참인 배열을 필터링하는데,
      filter() 의 기준은 includes() 이용해 search의 값을 포함하고 있다면 true, 없다면 false를 반환함
    • 생성한 getFilterData 함수를 호출하고 'filterData' 변수에 담아준 뒤 이 배열을 리스트로 반환함
    • 대·소문자 구분없이 하기 위해서 toLocaleLowerCase() 이용해서 검색어와 todo의 content를 모두 소문자로 변환함

    📌실행화면

    반응형

    댓글