위스타그램이 종료 후 금 토 일 동안 나온 과제를 만들고있었다.
리액트의 기초들을 이 과제로 정리해보세요 라는 느낌이 큰 과제를 이 monster 과제로 정리하는 시간을 보냈다.
- 파일:
Monsters.js
- 아래 키워드들을 활용해 데이터 로딩을 처리해주세요!
componentDidMount()
fetch()
→ 호출할 API 주소: https://jsonplaceholder.typicode.com/userssetState()
→ state 객체 내에monsters
라는 key 값에 저장
class Monsters extends Component {
constructor() {
super();
this.state = {
monsters: [],
};
}
// 데이터 로딩
componentDidMount() {
fetch("https://jsonplaceholder.typicode.com/users")
.then(res => {
//console.log(res);
return res.json();
})
.then(res => {
this.setState({
monsters: res
});
});
}
// SearchBox 에 props로 넘겨줄 handleChange 메소드 정의
render() {
);
return (
<div className="Monsters">
<h1>컴포넌트 재사용 연습!</h1>
{<SearchBox />}
{<CardList />}
</div>
);
}
}
- 파일:
Monsters.js
- API 호출 후 저장한 배열을 자식 컴포넌트인
<CardList />
에 넘겨주세요. (props 활용)- 넘겨준 후
CardList.js
에서 props 를 콘솔에 찍어 확인해주세요.
(개발 단계에서 확인하는 용도이니 확인 완료 후 push 하기 전에는 지워주세요!)
monster.js
<CardList monster={monsterFiltered} />
CardList.js
class CardList extends Component {
render() {
//console.log(this.props);
return (
<div className="card-list">
{this.props.monster.map(monster => (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
))}
</div>
);
}
}
- 파일:
CardList.js
- 🚨
Array.map()
함수 사용법을 꼭 익히고 시작해주세요!- 넘겨받은 배열을 기준으로
Array.map()
함수를 활용하여<Card />
컴포넌트를 리턴해주세요.Card.js
에게 넘겨줘야하는 props 는 각 몬스터 객체의id
,name
,
class CardList extends Component {
render() {
//console.log(this.props);
return (
<div className="card-list">
{this.props.monster.map(monster => (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
))}
</div>
);
}
}
CaldList 에서 card로 monster라는 인자를 넘겨준다.
key값은 리액트에서 중요한 꼭 필요한 인자이다.
arr.map(callback(currentValue[, index]))
파일: Card.js
Card.js 컴포넌트 모양 및 구조
<div className="card-container">
<img src=이미지주소 alt="" />
<h2>Name</h2>
<p>Email</p>
</div>
이미지 주소 (src
)
https://robohash.org/숫자?set=set2&size=180x180
카드마다 다른 이미지를 보여주기 위해 위 주소의 숫자
부분을 props 로 내려받은 id
로 대체해주세요.
예시)
https://robohash.org/1?set=set2&size=180x180
https://robohash.org/2?set=set2&size=180x180
https://robohash.org/3?set=set2&size=180x180
class Card extends Component {
render() {
return (
<div className="card-container">
<img
src={`https://robohash.org/${this.props.id}?set=set2&size=180x180`}
alt="몬스터"
/>
<h2>{this.props.name}</h2>
<p>{this.props.Email}</p>
</div>
);
}
}
export default Card;
render() {
//console.log(this.state.monsters);
// console.log("userInput : ", this.state.userInput, this.state.monsters);
// console.log(this.setState.userInput);
const monsterFiltered = this.state.monsters.filter(monster =>
monster.name.toLowerCase().includes(this.state.userInput.toLowerCase())
);
console.log(monsterFiltered);
return (
<div className="Monsters">
<h1>컴포넌트 재사용 연습!</h1>
{/* <SearchBox handleChange=정의한메소드 /> */}
{<SearchBox handleChange={this.handleChange} />}
{/* <CardList monsters=몬스터리스트 /> */}
<CardList monster={monsterFiltered} />
</div>
);
}
}
부모에서 자식의 자식컴포넌트의 전달방법을 배우게되었다.
그리고 filiter을 쓸때 render를 하고 나서 그안의 변수를 적용해 써주는 것을 알게되었다.
과제를 진행하게되면 하나씩 하나씩 배우개된다.