[react]モンスター課題コメント
key word
componentDidMount()
の特性と用途fetch()
関数呼び出しAPImap()
利用関数回収コンポーネントprops
提供一方向データfilter()
検索実施Monsters.js
import React, { Component } from "react";
import SearchBox from "./Components/SearchBox/SearchBox";
import CardList from "./Components/CardList/CardList";
import "./Monsters.scss";
class Monsters extends Component {
state = {
monsters: [],
userInput: "",
};
componentDidMount() {
fetch("https://jsonplaceholder.typicode.com/users", {
method: "GET",
})
.then((res) => res.json())
.then((data) => {
this.setState({
monsters: data,
});
});
}
handleChange = (e) => {
this.setState({
userInput: e.target.value,
}); // 검색창에 값이 들어오면 실행되는 함수.
};
render() {
const { monsters, userInput } = this.state;
const matchvalue = monsters.filter((monsters) =>
monsters.name.toLowerCase().includes(userInput)
);
return (
<div className="Monsters">
<h1>컴포넌트 재사용 연습!</h1>
{/* <SearchBox handleChange=정의한메소드 /> */}
<SearchBox handleChange={this.handleChange} />
<CardList matchvalue={matchvalue} />
</div>
);
}
}
export default Monsters;
componentDIdMount(), fetch()
fetch関数のパラメータとしてapiアドレスを入れることでJsonデータを受信する.GET方式でデータを受信すれば良いだけです.
Json形式のデータをJavaScript形式に変換し、monsters配列にデータを入れます.
then
を使用する理由は、apiからJson形式のデータを受信するのに時間がかかり、すべてのデータを受信した後、次の操作を行い、Json形式からJavascript形式にすべてのデータを変換してから操作を行うためです.fetch関数は通常、ComponentDidMount()関数で実行され、ステータス値をsetStateに変更するとrender()が再実行され、render()はfetchが再実行され、無限ループで回転します.ComponentDidMount()は、最初のレンダリングが終了した後に一度だけ実行される特性を持つため、これらの問題を防止します.
SearchBox.js
import React, { Component } from "react";
import "./SearchBox.scss";
class SearchBox extends Component {
render() {
return (
<input
className="search"
type="search"
placeholder="Search..."
onChange={this.props.handleChange}
/>
);
}
}
export default SearchBox;
フィルタを使用した検索
handleChange = (e) => {
this.setState({
userInput: e.target.value,
});
};
render() {
const { monsters, userInput } = this.state; //구조분해할당
const matchvalue = monsters.filter((monsters) =>
monsters.name.toLowerCase().includes(userInput)
);
return (
<div className="Monsters">
<h1>컴포넌트 재사용 연습!</h1>
<SearchBox handleChange={this.handleChange} />
<CardList matchvalue={matchvalue} />
</div>
);
}
}
export default Monsters;
->apiを使用してmonstersに配置されたデータキーの名前を小文字に変換し、ユーザー入力値を含むデータキーをフィルタします.
CardList.js
import React, { Component } from "react";
import Card from "../Card/Card";
import "./CardList.scss";
class CardList extends Component {
render() {
const { matchvalue } = this.props; //구조분해할당
return (
<div className="card-list">
{matchvalue.map((el) => (
<Card id={el.id} name={el.name} email={el.email} />
))}
</div>
);
}
}
export default CardList;
Card.js
import React, { Component } from "react";
import "./Card.scss";
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="" />
<h2>{name}</h2>
<p>{email}</p>
</div>
);
}
}
export default Card;
入力した値は名前に含まれるモンスターのみを出力します.
Reference
この問題について([react]モンスター課題コメント), 我々は、より多くの情報をここで見つけました https://velog.io/@heyho9292/react-monster-과제-리뷰テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol