인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

seongmin20533705's profile image
seongmin20533705

asked

Bite-sized React.js: From Basics to Practice

8.5) Read - Rendering the Todo List

리스트의 검색 기능에 대한 질문입니다!

Written on

·

216

0

안녕하십니까! 해당 강의를 열심히 들으며 리엑트를 공부하고 있는 대학생입니다. 듣다가 막히는 부분이 생겨 질문을 하게 되었습니다.

List.jsx 에서 검색 기능을 구현하는 부분에서 궁금한 것이 생겼습니다. 강의에서는 아래 코드처럼 getFilteredData 함수를 작성하셨습니다.

const getFilteredData = () => {
        if(search === ""){
            return todos;
        }
        return todos.filter((todo) => {
            todo.content.toLowerCase().includes(search.toLowerCase())
        });
    };

하지만 저는 아무리 오타를 점검하고 수정해도 기능이 구현이 되지 않아서 답답한 마음에 GPT를 통해 질문을 했는데 위 함수에서 return이 빠져있다고 수정해주었습니다. 아래는 GPT가 수정해준 코드입니다.

const getFilteredData = () => {
        if(search === ""){
            return todos;
        }
        return todos.filter((todo) => {
            return todo.content.toLowerCase().includes(search.toLowerCase())
        });
    };

위 코드를 보시면 filter() 안에 화살표 함수 내부에 return이 추가된 것을 볼 수 있습니다. 그리고 실제로 이렇게 수정을 하고서야 제 기능이 정상적으로 작동이 되었습니다.

왜 이런 결과가 생겼는지 궁금합니다. 제가 뭘 잘못했길래 강의와는 다르게 return을 추가해야만 기능이 제대로 구현이 되는지 여쭤보고 싶습니다.
혹시나 제가 찾지 못하는 오타가 있을까 해서 강의와 똑같이 따라한 전체 List.jsx 코드도 함께 첨부하겠습니다. 감사합니다!

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

const List = ({todos}) => {
    const [search, setSearch] = useState("");

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

    const getFilteredData = () => {
        if(search === ""){
            return todos;
        }
        return todos.filter((todo) => {
            todo.content.toLowerCase().includes(search.toLowerCase())
        });
    };

    const filteredTodos = getFilteredData();

    return <div className="List">
        <h4>Todo List 🌱</h4>
        <input
            value={search} 
            onChange={onChangeSearch} 
            placeholder="검색어를 입력하세요"
        />
        <div className = "todos_wrapper">
            {filteredTodos.map((todo) => {
                return <TodoItem key={todo.id} {...todo}/>;
            })}
        </div>
    </div>
}

export default List;
javascriptreactnode.js

Answer 3

2

winterlood님의 프로필 이미지
winterlood
Instructor

안녕하세요 이정환입니다.

결론부터 말씀드리자면, 화살표 함수의 사용법이 잘못되었기 때문입니다.

강의의 자바스크립트 기초 챕터에서 안내드렸듯 화살표 함수는 화살표(=>) 뒤에 중괄호({)가 나타날 경우 일반 함수처럼 return을 명시적으로 적어줘야 반환값 설정이 가능합니다. 그러나 화살표 뒤에 그냥 리턴하고자 하는 값을 설정할 경우 이 값이 그대로 리턴됩니다. 질문자님의 코드에는 화살표 뒤에 중괄호가 있네요, 이 중괄호를 제거하시면 return을 사용하지 않으셔도 됩니다.

1

안녕하세요, 인프런 AI 인턴입니다.

seongmin2053님, 질문 주신 내용에 대해 답변드리겠습니다. 코드에서 filter 메서드는 모든 요소에 대해 콜백 함수를 호출하고, 해당 함수가 true를 반환하는 요소들만으로 새로운 배열을 생성합니다. 따라서 filter 메서드의 콜백 함수 내부에는 항상 조건문이 truefalse 값을 반환하도록 return 문이 필요합니다.

보내주신 코드에서는 아래와 같은 문제가 발생했을 가능성이 큽니다:

return todos.filter((todo) => {
    todo.content.toLowerCase().includes(search.toLowerCase());
});

위 코드의 filter 콜백 함수 내에서는 includes 결과를 반환하지 않기 때문에 암묵적으로 undefined를 반환하게 됩니다. undefinedtrue가 아니므로 해당 조건을 만족하는 요소가 없는 것처럼 처리됩니다. 따라서, return 문을 추가하여 다음과 같이 수정해야 정상적으로 작동합니다:

return todos.filter((todo) => {
    return todo.content.toLowerCase().includes(search.toLowerCase());
});

이렇게 수정하게 되면, filter 메서드가 truefalse를 올바르게 받게 되어 의도한 대로 필터링이 이루어지게 됩니다.

아래의 관련 질문과 가능한 해결책을 통해 더 깊이 있는 정보를 얻으실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

오호!! 저도 왜 검색 필터링이 되지 않을까? 싶었는데,

확인해보니 콜백함수 중괄호 안에 return을 안썼네요!

ㅎㅎ감사합니다

seongmin20533705's profile image
seongmin20533705

asked

Ask a question