props
를 전달하기 위해서 id, name, email을 props
로 설정해준다.import React from "react";
import "./Card.scss";
function Card( {id, name, email}) {
return <div className="cardContainer">
<img alt = 'monster' src = {`https://robohash.org/${id}?set=set2&size=180x180`} />
<h2 className='cardName'>{name}</h2>
<p className="cardEmail">{email}</p>
</div>;
}
export default Card;
TIP)
props
를 매개변수로 가져올 때 구조분해할당을 이용하여 인자란에 바로 객체로 풀어써줄 수 있다.- ex) props를 id, name, email로 설정하고 싶으면 인자란에
props
를 넣고props.id
,props.name
,props.email
쓰는 대신 props 인자란에 바로{id, name, email}
을 넣으면props
로id
,name
,props
가 많을 경우 인자에는 props를 써주고 함수 statement 안에서 구조분해할당을 해주는 방법이 좋다.- 이 방법은 배열의
map method
에 대해서도 똑같이 적용할 수 있다.
monster props
를 설정해준다.id props
를 key로 받아온다.(통상적)props
를 통해 전달한다. ex) data의 id => Card의 id propsimport React from "react";
import Card from "../Card/Card";
import "./CardList.scss";
function CardList({monster}) {
return <div className="cardList">
{monster.map(data => (
<Card
id={data.id}
name = {data.name}
email={data.email}
key={data.id}
/>
))}
</div>;
}
export default CardList;
handleChange props
를 저장하여 부모로부터 handleChange method를 받아온다.import React from "react";
import "./SearchBox.scss";
function SearchBox(props) {
return (
<input
className="search"
type="search"
placeholder="Search..."
onChange={props.handleChange}
/>
);
}
export default SearchBox;
handleChange props
에는 input의 value값을 받아오는 메소드를 넘겨준다.monster props
에 전달할 데이터는 useEffect의 fetch 함수를 통해 가져온다.필터링 로직 구현!!!! (filter method 활용)
const sortedMonsters = monsters.filter((monster) => { return monster.name.toLowerCase().includes(userInput.toLowerCase()); });
- SearchBox에 값을 입력하였을 시 해당 값을 가진 Monster의 이름을 추출하는 함수를 정의하였다.
- 대소문자를 가리면 안되기 때문에
.toLowerCase
를 활용하였다.- CardList의 props에 전달할 데이터이다.
import React, { useState, useEffect } from "react";
import SearchBox from "./Components/SearchBox/SearchBox";
import CardList from "./Components/CardList/CardList";
import "./Monsters.scss";
function Monsters() {
const [monsters, setMonsters] = useState([]);
const [userInput, setUserInput] = useState("");
// 데이터 로딩
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users") // (1)
.then(res => res.json()) // (2)
.then(res => setMonsters(res)) // (3)
}, [])
// SearchBox의 props로 넘겨줄 handleChange 메소드 정의
const handleSearchBox = e => {
setUserInput(e.target.value);
}
// CardList의 props로 넘겨줄 filter를 홣용한 monsterdata sortedMonster 메소드 정의
const sortedMonsters = monsters.filter((monster) => {
return monster.name.toLowerCase().includes(userInput.toLowerCase());
});
return (
<div className="monsters">
<h1>컴포넌트 재사용 연습!</h1>
{<SearchBox handleChange={handleSearchBox} />}
{ <CardList monster={sortedMonsters} />}
</div>
);
}
export default Monsters;
확실히 헷갈렸던 props 및 자식부모컴포넌트를 이해하는데 많은 도움이 되었다.
자식 컴포넌트의 props를 통해 부모 컴포넌트의 state 및 데이터를 넘겨주는 방법(이벤트까지)에 대해서 많이 익숙해진 것 같다.
props를 잘 활용하기 위해서는 자식 부모 컴포넌트의 관계파악 및 설정부터 확실히 알고 있는게 중요한 것 같다.
Filter를 활용한 monster 함수를 정의하는 것에서 많이 애를 먹었다. filter가 아직 익숙하지 않아서 그런것 같다.
React의 컴포넌트를 다루는 방법에 대해서는 state, props말고도 더 배울 것이 많다. 추후 블로그를 통해 또 정리할 예정이다.