React/미니프로젝트

4. Todo List 컴포넌트 기능 구현(3)

babydeve 2023. 7. 27. 15:02

할 일 리스트 렌더링 TodoList

 

[ TodoList(  )의 파라미터 ]

const TodoList = ({ todo, onUpdate, onDelete }) => { (...) } props를 구조분해 할당한다.

 

[TodoList(  )에서 return 된 HTML ]

    return <div className="TodoList">
            <h4>Todo List</h4>
            <input
                  value={search}
                  onChange={onChangeSearch}
                  className="searchbar"
                  placeholder="검색어를 입력하세요"
             />
            <div className="list_wrapper">
                {getSearchReuslt().map((work) => {
                    <TodoItem
                                key={work.id}
                                {...work}
                                onUpdate={onUpdate}
                                onDelete={onDelete}
                     />

                })}
            </div>
        </div>
input의 value 값으로 {search}props를 할당한다.
input 입력시마다 onChangeSearch 함수가 실행된다.

검색결과를 배열로 받는 getSearchReuslt()를 새로운 아이템으로 재배열 한다.
todo의 모든 요소를 순차적으로 순회하며 HTML로 변환.
work의 모든 프로퍼티를 스프레드 연산자를 이용해 props로 전달한다.

* onUpdate()전달 : App->TodoList->TodoItem

* 리액트 컴포넌트는 바로 한 단계 아래의 자식 컴포넌트에만 데이터 전달이 가능해 한 단계 이상으로 데이터를 전달하려면 전달을 반복해야한다.비효율적(=props Drilling)

특정컴포넌트를 수정, 추가, 삭제하는 경우 key로 어떤 컴포넌트를 업데이트할지 결정한다.
Ref 객체로 고유 id를 만들었기 때문에 id를 key로 전달하면 문제를 해결할 수 있다.
map을 이용해 컴포넌트를 리스트 형태로 반복적으로 렌더링하려면 반드시 리스트 내의 고유한 key를 Props로 전달해야한다.

[ TodoList(  ) 내에 선언된 것들]

    const [ search, setSearch ] = useState("");

    const onChangeSearch = (e) => {
        setSearch(e.target.value);
    }
검색창을 초기화한다.

검색어의 값이 바뀔때마다 setSearch에 검색어 값을 업데이트한다.
    const getSearchReuslt = () => {
        return search === "" 
                ? todo
                : todo.filter((work) => {
                        work.content.toLowerCase().includes(search.toLowerCase())})
    }
입력한 검색어인 search가 빈문자열이면 todo를 그대로 반환, 아니면 필터링(소문자로 바꾼 컨텐트에 소문자로 바꾼 검색어 글자가 포함되어있는 것들을 필터링한다.)

 

TodoList.js

import { useState } from 'react';
import TodoItem from './TodoItem'
import './TodoList.css'

const TodoList = ({ todo, onUpdate, onDelete }) => { //props를 구조분해 할당한다.
    const [ search, setSearch ] = useState("");
    const onChangeSearch = (e) => {
        setSearch(e.target.value);
    }
    const getSearchReuslt = () => {
        return search === "" ? todo : todo.filter((work) => {work.content.toLowerCase().includes(search.toLowerCase())})
    }
    
    return(
		<div className="TodoList">
            <h4>Todo List</h4>
            <input value={search} onChange={onChangeSearch} className="searchbar" placeholder="검색어를 입력하세요" />
            <div className="list_wrapper">
                {getSearchReuslt().map((work) => {
                    <TodoItem key={work.id} {...work} onUpdate={onUpdate} onDelete={onDelete} />
                })}
            </div>
        </div>
	)
}

export default TodoList;

 

 

 

 

 

728x90