1.이런식으로 useState와 map 등을 사용하여 화면을 구성하고
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((response) => response.json())
.then((data) => {
setMonsters(data);
});
}, []);
{monsters.map((item, i) => {
return (
<div className="card" key={item.id}>
<img
src={"https://robohash.org/" + item.id + "?set=set2&size=180x180"}
></img>
<h2>{item.name}</h2>
<p>{item.email}</p>
</div>
);
})}
첫번째 사진처럼 출력 완료.
function handleChange(e) {
setUserInput(e.target.value.toUpperCase());
}
영어는 소문자와 대문자를 구별하기 때문에 대문자로 바꾸던가 소문자로 바꾸던가 해서 저장하자.
<CardList monsters={monsters} />
그래서 이렇게 monsters state를 자식 컴포로 전달해서
monsters.filter((monster)=>monster.name.toUpperCase().includes(userInput))
이렇게 걸러냈는데 이렇게 되면 변하면 안되는 데이터인 monsters를 건드리는 것이라 나중엔 요소가 다 삭제되어 다 비어버리게 되었다.
그래서 억지로 userInput의 length가 0이 되면 다시 데이터를 불러와 monsters에 세팅하도록 했는데 너무 억지스러웠다.
let copy = [...monsters];
copy = monster.filter((monster) =>
monster.name.toUpperCase().includes(userInput));
독립적 카피본을 만들어서 인풋에 따라 걸러지게 한 다음 이 copy가 자식 컴포로 전달되게 하고 map()을 실행했음.
자식 컴포가 전달받는 copy는
이런 과정들이 반복되어 필터링이 가능해짐!!@!@!@