React - Monster
๐พ Task 1. API ํธ์ถ
- ์ ์ฃผ์๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ฒ๋ฆฌํด์ฃผ์ธ์!
- componentDidMount()
- fetch
- setState (monsters ์ ์ ์ฅ)
componentDidMount() {
fetch("https://jsonplaceholder.typicode.com/users", {
method: "GET",
})
.then((res) => res.json())
.then((data) => {
this.setState({
monsters: data,
});
});
}
๐พ Task 2. API ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐ props ๋ก ์์์๊ฒ ์ ๋ฌ
- API ํธ์ถ ํ ์ ์ฅํ ๋ฐฐ์ด์ ์์ ์ปดํฌ๋ํธ์ธ
<CardList />
์ ๋๊ฒจ์ฃผ์ธ์. (props ํ์ฉ)
- ๋๊ฒจ์ค ํ
CardList.js
์์ props ๋ฅผ ์ฝ์์ ์ฐ์ด ํ์ธํด์ฃผ์ธ์.
// Monsters.js
render() {
return (
<div className="Monsters">
<h1>์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ ์ฐ์ต!</h1>
<CardList monsters={monsterFilter} />
</div>
);
}
}
๐พ Task 3. Array.map( ) ์ฌ์ฉ
- ๋๊ฒจ๋ฐ์ ๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก
Array.map()
ํจ์๋ฅผ ํ์ฉํ์ฌ<Card />
์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํดํด์ฃผ์ธ์.
Card.js
์๊ฒ ๋๊ฒจ์ค์ผํ๋ props ๋ ๊ฐ ๋ชฌ์คํฐ ๊ฐ์ฒด์id
,name
,email
์ ๋๋ค.
class CardList extends Component {
render() {
//ES6 ๊ฐ์ฒด, ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น
const { monsters } = this.props;
return (
<div className="card-list">
{monsters.map((monster) => {
return (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
);
})}
</div>
);
}
}
๐พ Task 4. props ํ์ฉ
Card ์ปดํฌ๋ํธ ๊ตฌ์กฐ
<img src=์ด๋ฏธ์ง์ฃผ์ alt="">
<h2>Name</h2>
<p>Email</p>
class Card extends Component {
render() {
const { id, name, email } = this.props;
return (
<div className="card-container">
<img
src={`https://robohash.org/${id}?set=set2&size=180x180`}
alt="moster"
></img>
<h2>{name}</h2>
<p>{email}</p>
</div>
);
}
}
๐พ Task 5. ํํฐ๋ง ๋ก์ง ๊ตฌํ(filter ๋ฉ์๋ ํ์ฉ)
- ์ฌ๊ธฐ์ ๋น๊ต ๋์์ monster ๊ฐ์ฒด์ name ๊ฐ์ ๋๋ค.
- ์๋ฌธ์๋ก ๋ฐ๊พผ monster.name ๊ฐ๊ณผ userInput๊ฐ์ ๋น๊ต.
- filter ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ ๋ณ์์ ์ ์ฅ ํ return ๋ฌธ ์์ CardList์ props๋ก ์ ๋ฌ
// SearchBox ์ props๋ก ๋๊ฒจ์ค handleChange ๋ฉ์๋ ์ ์
handleChange = (e) => {
this.setState({
userInput: e.target.value,
});
};
// SearchBox.js
class SearchBox extends Component {
render() {
return (
<input
className="search"
type="search"
placeholder="Search..."
onChange={this.props.handleChange}
/>
);
}
}
// Monsters.js
render() {
const monsterFilter = this.state.monsters.filter((monster) =>
monster.name.toLowerCase().includes(this.state.userInput.toLowerCase())
);
return (
<div className="Monsters">
<h1>์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ ์ฐ์ต!</h1>
<SearchBox handleChange={this.handleChange} />
<CardList monsters={monsterFilter} />
</div>
);
}
}