본문 바로가기
팀프로젝트_기록일지/React복습용글

TodoList_복습1

by 코잼민 2025. 1. 18.

● List.js : 검색창에 입력값에 따라 바로 렌더링

import { useState } from "react";
import "./List.css";
import TodoItem from "./TodoItem";

function List({ items, onUpdateItem, onDeleteItem }) {
  const [search, setSearch] = useState("");

  const onChangeSearch = (event) => {
    setSearch(event.target.value);
  };

  const onKeyDownSearch = (event) => {
    if (event.keyCode === 13) {
      // 검색어가 없으면 필터링하지 않고 반환
      if (search === "") {
        return;
      }
    }
  };

  const getFilterItems = () => {
    // 검색어가 비어 있으면 전체 항목 반환
    if (search === "") {
      return items;
    }
    // 검색어가 있으면 필터링된 항목 반환
    return items.filter((item) =>
      item.content.toLowerCase().includes(search.toLowerCase())
    );
  };

  // getFilterItems()를 호출해 필요한 항목을 렌더링
  const filteredItems = getFilterItems();

  return (
    <div className="List">
      <p>Todo List🌱</p>
      <input
        onKeyDown={onKeyDownSearch}
        onChange={onChangeSearch}
        value={search}
        placeholder="검색어를 입력하세요."
      />
      <div className="Lists">
        {filteredItems.map((item) => (
          <TodoItem
            key={item.id}
            item={item}
            onDeleteItem={onDeleteItem}
            onUpdateItem={onUpdateItem}
          />
        ))}
      </div>
    </div>
  );
}

export default List;

● List.js : 엔터심에만 검색 가동 , 렌더링 코드 :

import { useState } from "react";
import "./List.css";
import TodoItem from "./TodoItem";

function List({ items, onUpdateItem, onDeleteItem }) {
  const [search, setSearch] = useState("");

    //onChange에 대한 핸들러 제거,
    //onkeyDown에만 핸들러 적용 + 그때만 search 업데이트 

  const onKeyDownSearch = (event) => {
    if (event.keyCode === 13) {
      setSearch(event.target.value);

      // 검색어가 없으면 필터링하지 않고 반환
      if (search === "") {
        return;
      }
    }
  };
//search가 끝날때만 , items 업데이트
  const getFilterItems = () => {
    // 검색어가 비어 있으면 전체 항목 반환
    if (search === "") {
      return items;
    }
    // 검색어가 있으면 필터링된 항목 반환
    return items.filter((item) =>
      item.content.toLowerCase().includes(search.toLowerCase())
    );
  };

  // getFilterItems()를 호출해 필요한 항목을 렌더링
  const filteredItems = getFilterItems();

  return (
    <div className="List">
      <p>Todo List🌱</p>
      <input onKeyDown={onKeyDownSearch} placeholder="검색어를 입력하세요." />
      <div className="Lists">
        {filteredItems.map((item) => (
          <TodoItem
            key={item.id}
            item={item}
            onDeleteItem={onDeleteItem}
            onUpdateItem={onUpdateItem}
          />
        ))}
      </div>
    </div>
  );
}

export default List;

● List.js : 검색 , 삭제 , 추가 , 수정 기능 외에는 재랜더링 되지 않도록, useMemo 적용 + 집계도 출력하기

즉, 검색, 추가 입력창에 타이핑 되는 동안에는 검색, 집계가 작동되지 않도록 최적화

import { useMemo, useState } from "react";
import "./List.css";
import TodoItem from "./TodoItem";

function List({ items, onUpdateItem, onDeleteItem }) {
  const [search, setSearch] = useState("");

  const onKeyDownSearch = (event) => {
    if (event.keyCode === 13) {
      setSearch(event.target.value);

      // 검색어가 없으면 필터링하지 않고 반환
      if (search === "") {
        return;
      }
    }
  };
  // getFilterItems()를 호출해 필요한 항목을 렌더링
  const filteredItems = useMemo(() => {
    console.log("검색기능!!");

    if (search === "") {
      return items;
    }
    // 검색어가 있으면 필터링된 항목 반환
    return items.filter((item) =>
      item.content.toLowerCase().includes(search.toLowerCase())
    );
  }, [items, search]);

  //개수 출력
  const { totalCount, isDoneCount, isNotDoneCount } = useMemo(() => {
    console.log("집계과정");

    const totalCount = items.length;
    const isDoneCount = items.filter((item) => item.isDone).length;
    const isNotDoneCount = totalCount - isDoneCount;

    return { totalCount, isDoneCount, isNotDoneCount };
  }, [items]);

  return (
    <div className="List">
      <p>Todo List🌱</p>
      <div className="PrintCount">
        <p>총 항목 개수 : {totalCount}</p>
        <p>완료 항목 개수 : {isDoneCount}</p>
        <p>미완료료 항목 개수 : {isNotDoneCount}</p>
      </div>
      <input onKeyDown={onKeyDownSearch} placeholder="검색어를 입력하세요." />
      <div className="Lists">
        {filteredItems.map((item) => (
          <TodoItem
            key={item.id}
            item={item}
            onDeleteItem={onDeleteItem}
            onUpdateItem={onUpdateItem}
          />
        ))}
      </div>
    </div>
  );
}

export default List;

'팀프로젝트_기록일지 > React복습용글' 카테고리의 다른 글

(1)React_배열Render, sort,delete  (0) 2025.01.02