const [monsters, setMonsters] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => {
return response.json();
})
.then((result) => {
setMonsters(result);
});
}, []);
import React, { useState } from 'react';
import React, { useEffect } from 'react';
const [userInput, setUserInput] = useState('');
function handleChange(e) {
setUserInput(e.target.value);
}
const filterMonsters = monsters.filter((monster) => {
return monster.name.toLowerCase().includes(userInput.toLowerCase());
});
function CardList({ monsters }) {
return (
<div className='cardList'>
{monsters.map((monster) => {
return (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
);
})}
</div>
);
}
<CardList monsters={filterMonsters} />
1. Props 개념에 대한 이해
props를 통해 부모에서 자식 컴포넌트로 데이터를 전달할 수 있다는 사실은 리액트 개념 수업 시간에 들어서 익히 알고 있었다. 여기서 중요한 포인트는 바로 부모에서 자식 컴포넌트로 전달할 수 있다라고 생각했다. 하지만 여기서 '어떤 데이터'를 전달해주는냐에 따라 화면에 보여지는 것 또한 달라질 수 있다는 사실을 검색 기능 구현을 통해 확실히 알게 되었다.
2. 검색 기능 로직
기능 로직을 스스로 고민해보고 생각해내는 것은 아직은 나에게 너무 어렵다. 언젠가는 익숙해질 날이 오기를 기다리며 오늘도 글로 다시 정리해보는 시간을 가져본다. 처음에는 useState도 useEffect도 막 여러개 생성해야 하는 것이 아닌가 나름 복잡하지만 검색이 될 때의 순서를 생각하며 이유 있는 생각들을 해보았다. Monster Card가 첫랜더링 되었을 때 화면에 전부 보여져야 하기 때문에 일단 CardList에 API로 불러온 원본 데이터를 보여지게 하는건 무조건 맞다. 그 다음이 정말 생각이 안난다. 그런 다음 필터링된 카드를 새로운 useState에 담고 그것을 다시 새로운 Effect로 다시 로딩해주면 되지 않을까하는 생각을 했다. 하지만 이렇게 hook을 남용한다고? 라는 합리적 의심으로 잘못된 생각이라는 걸 느낌으로 알았다. 결론은 CardList props에 필터된 데이터를 넣어주면 모든 것이 깔끔하게 해결된다. props는 이렇게 사용하는 거라는 걸 또 알게되는 순간이다.