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;
Answer 3
2
안녕하세요 이정환입니다.
결론부터 말씀드리자면, 화살표 함수의 사용법이 잘못되었기 때문입니다.
강의의 자바스크립트 기초 챕터에서 안내드렸듯 화살표 함수는 화살표(=>) 뒤에 중괄호({)가 나타날 경우 일반 함수처럼 return을 명시적으로 적어줘야 반환값 설정이 가능합니다. 그러나 화살표 뒤에 그냥 리턴하고자 하는 값을 설정할 경우 이 값이 그대로 리턴됩니다. 질문자님의 코드에는 화살표 뒤에 중괄호가 있네요, 이 중괄호를 제거하시면 return을 사용하지 않으셔도 됩니다.
1
안녕하세요, 인프런 AI 인턴입니다.
seongmin2053님, 질문 주신 내용에 대해 답변드리겠습니다. 코드에서 filter
메서드는 모든 요소에 대해 콜백 함수를 호출하고, 해당 함수가 true
를 반환하는 요소들만으로 새로운 배열을 생성합니다. 따라서 filter
메서드의 콜백 함수 내부에는 항상 조건문이 true
나 false
값을 반환하도록 return
문이 필요합니다.
보내주신 코드에서는 아래와 같은 문제가 발생했을 가능성이 큽니다:
return todos.filter((todo) => {
todo.content.toLowerCase().includes(search.toLowerCase());
});
위 코드의 filter
콜백 함수 내에서는 includes
결과를 반환하지 않기 때문에 암묵적으로 undefined
를 반환하게 됩니다. undefined
는 true
가 아니므로 해당 조건을 만족하는 요소가 없는 것처럼 처리됩니다. 따라서, return
문을 추가하여 다음과 같이 수정해야 정상적으로 작동합니다:
return todos.filter((todo) => {
return todo.content.toLowerCase().includes(search.toLowerCase());
});
이렇게 수정하게 되면, filter
메서드가 true
나 false
를 올바르게 받게 되어 의도한 대로 필터링이 이루어지게 됩니다.
아래의 관련 질문과 가능한 해결책을 통해 더 깊이 있는 정보를 얻으실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0