props 자리에 바로 destructring할 수 있다.
card-list.jsx 파일
props를 생략하고 바로 filteredMonsters만 보이게 할 것이다.
자바스크립트 { } 를 써서 filteredMonsters를 argument 자리에 바로 넣어준다.
return도 삭제한다.
import Card from '../card/card';
import './card-list.css';
const CardList = ({ filteredMonsters }) =>
<div className='card-list'>
{filteredMonsters.map((monster) => {
return (
<Card
monster={monster}
/>
)
})}
</div>
export default CardList;
search-box.jsx 정리
import './search-box.css';
const SearchBox = ({ className, placeholder, onChangeHandler }) =>
<div>
<input
className={`search-box ${className}`}
placeholder={placeholder}
onChange={onChangeHandler}
/>
</div>
export default SearchBox;
card.jsx 정리
한 단계 더 가서 id, name, email을 monster 옆에 바로 정의해서 줄일 수 있다.
import './card.css';
const Card = ({ monster: { id, name, email } }) => {
return (
<div key={id} className='card-container'>
<img
alt={`monster ${name}`}
/>
<h1>{name}</h1>
<p>{email}</p>
</div>
)
}
export default Card;
import { useState, useEffect } from 'react';
import './App.css';
import SearchBox from './components/search-box/search-box';
import CardList from './components/card-list/card-list';
const App = () => {
const [searchField, setSearchField] = useState('');
const [monsters, setMonsters] = useState([]);
const [filteredMonsters, setFilterMonsters] = useState(monsters);
useEffect(() => {
.then((response) => response.json())
.then((users) => setMonsters(users));
}, []);
useEffect(() => {
const newFilteredMonsters = monsters.filter((monster) => {
return monster.name.toLocaleLowerCase().includes(searchField);
});
setFilterMonsters(newFilteredMonsters)
}, [monsters, searchField])
const onSearchChange = (event) => {
const searchFieldString = event.target.value.toLocaleLowerCase();
setSearchField(searchFieldString);
}
return (
<div>
<h1 className='app-title'>Monsters Rolodex</h1>
<SearchBox
className='monsters-search-box'
placeholder='Search Monsters'
onChangeHandler={onSearchChange}
/>
<CardList
filteredMonsters={filteredMonsters}
/>
</div>
)
}
export default App;
App.css
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background: linear-gradient(to left,
rgb(248, 217, 191) 0%,
rgb(250, 250, 197) 100%);
text-align: center;
}
.app-title {
margin-top: 75px;
margin-bottom: 50px;
font-size: 7rem;
color: rgb(23, 133, 152);
font-family: 'Bigelow Rules'
}
card-list.css
.card-list {
width: 85vw;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-gap: 20px;
}
search-box.css
.search-box {
-webkit-appearance: none;
border: none;
outline: none;
padding: 10px;
width: 300px;
line-height: 30px;
margin-bottom: 30px;
font-size: large;
}
card.css
.card-container {
display: flex;
flex-direction: column;
background-color: rgb(221, 221, 153);
border: 1px solid rgb(172, 171, 171);
border-radius: 5px;
padding: 25px;
cursor: pointer;
-moz-osx-font-smoothing: grayscale;
backface-visibility: hidden;
transform: translateZ(0);
transition: transform 0.25s ease-out;
}
.card-container:hover {
transform: scale(1.05);
}
'React > React Basic' 카테고리의 다른 글
React and ReactDOM | HTML안에 리액트 코드 바로 작성해보기 (0) | 2022.06.01 |
---|---|
Monsters-Rolodex 2-3 | useEffect | Fetch API (0) | 2022.05.29 |
Monsters-Rolodex 2-2 | useState 설치 (0) | 2022.05.29 |
[React] Object 특징 (0) | 2022.05.18 |
[React] Lifecycle Method 라이프 사이클 (0) | 2022.05.18 |
댓글