์ด์ react ์ธ์
์์ ๊ณผ์ ๋ก ๋์๋ monsters
๋ฅผ ๊นจ๋ถ์๊ณ ๐ช ์ด๋ป๊ฒ ๊นผ๋์ง ์ฝ๋๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค!!
๊ณผ์ ์์ ์๋ดํ ์์๋๋ก ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผ๊ฐ๋ฉด์ ๋ด
์๋ค!!
API ์ฃผ์๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ฒ๋ฆฌ
index.js
componentDidMount() {
fetch('https://jsonplaceholder.typicode.com/users')
.then((res) => res.json())
.then((res) => this.setState({ monsters: res }));
}
=> ์ด ์ฝ๋์ ๋ํ ์์ธํ ์ค๋ช ์ ๋ค๋ฅธ๊ธ์ ์์ฑํ์ผ๋ ์ฐธ๊ณ !
CardList ์ปดํฌ๋ํธ์ monsters ๋ผ๋ ์ด๋ฆ์ props๋ก monsters ๋ฐฐ์ด ์ ๋ฌ
index.js
<CardList monsters={this.state.monsters} />
monsters ๋ฐฐ์ด์ <CardList />
์ props ๊ฐ์ผ๋ก ์ ๋ฌ!!
์ด๋ฏธ์ง ์ฃผ์์ ์ซ์ ๋ถ๋ถ์ props๋ก ๋ด๋ ค๋ฐ์ id๋ก ๋์ฒด
Card.js
<img src={`https://robohash.org/${this.props.id}?set=set2&size=180x180`} alt={this.props.name} />
<h2>{this.props.name}</h2>
<p>{this.props.email}</p>
์ค๊ฐ์ props ๋ฅผ ๋ฃ์๋๋ ${ }
์ผ๋ก ๋ฃ์ด์ค๋ค!
JavaScript ํ
ํ๋ฆฟ ๋ฌธ์์ด ` ์ฒ๋ผ ์ธ ์ ์๋ค! ์์ ํธํ๋ค!๐
props๋ก ๋ด๋ ค๋ฐ์ ๋ฐ์ดํฐ์ map ํจ์๋ฅผ ํธ์ถํด์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง Card ์ปดํฌ๋ํธ๋ค์ ๋ฆฌํด
CardList.js
{this.props.monsters.map((monster, idx) => (
<Card key={idx} id={monster.id} name={monster.name} email={monster.email} />
))}
์ ๋ฌ๋ฐ์ monsters์ map
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ๊ฐ์ key, id, name, email ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋์ผ๋ก componen๊ฐ ๋ฐํ๋๋๋ก ์์ฑ!
(์ธ์คํ๊ทธ๋จ ๋๊ธ์ฐฝ๊ณผ ๋น์ทํด์ ์ฌ๊ธฐ๊น์ง ์ํ๋ค์๋ค...!)
Key
๋ React๊ฐ ์ด๋ค ํญ๋ชฉ์ ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ง ์๋ณํ๋ ๊ฒ์ ๋๋ ์ด๋ฆํ๊ฐ์ ์ญํ ์ ํ๋ค.
key
๊ฐ ์์ด๋ Virtual DOM์ ๋น๊ตํ๋ ๊ณผ์ ์์ ๋ฆฌ์คํธ๋ฅผ ์์ฐจ์ ์ผ๋ก ๋น๊ตํ๋ฉด์ ๋ณํ๋ฅผ ๊ฐ์งํ ์ ์์ง๋ง, key
๊ฐ ์๋ค๋ฉด ๋ณํ๋ฅผ ํจ์ฌ ๋นจ๋ฆฌ ์ธ์ํ ์ ์๋ค.
key
๊ฐ์ ์ค์ ํ ๋๋ map
ํจ์์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์ ๋ด๋ถ์์ ์ปดํฌ๋ํธ props๋ฅผ ์ค์ ํ๋ฏ์ด ์ค์ ํ๋ฉด ๋๋ค.
์ ๋ง ์ ๋ํฌํ ๊ฐ๋ง ๋ค์ด๊ฐ์ผ ํ๋ฉฐ, (ํธ๋ํฐ ๋ฒํธ, email, id ๋ฑ...) ๊ณ ์ ํ ์ ๋ณด๊ฐ ์๋ค๋ฉด index๋ฅผ key ๊ฐ์ผ๋ก ์ค ์ ์๋ค.
์์ ์ฝ๋๋ index ๊ฐ์
key
์ ๋ฃ์ด๋ณด๊ธฐ ์ํด ์์ฑํ ๊ฒ์ด๊ณ , id, email ์ฒ๋ผ ํ์ฉํ ์ ์๋ ๊ณ ์ ํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๊ทธ ๊ฐ์key
๊ฐ์ผ๋ก ์ฃผ๋๊ฒ ์ข๋ค!
index๋ฅผkey
๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋ ํจ์จ์ ์ผ๋ก ๋ฆฌ๋ ๋๋ง ํ๊ธฐ ํ๋ค๋ค๊ณ ํ๋ค...!
์ฐธ๊ณ ๋ก, ์ด ๋ ๋ถ์ฌํด์ฃผ๋ key
๊ฐ์ react ์์ ์๋ณํ๊ธฐ ์ํด ์ฃผ์ด์ง๋ ๊ฐ์ด๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ๋ฉ์๋๋ ์ด๋ฒคํธ์์ ์ฌ์ฉํ ์๋ ์๋ค!
๋ง์ฝ index ์ ๋ณด๊ฐ ํ์ํ๋ค๋ฉด, ๋ฐ๋ก index={idx} ๋ก index ์ ๋ณด๋ฅผ ๋ถ์ฌํด์ค์ผ ํ๋ค!
์ ์ํ handleChange ๋ฉ์๋๋ฅผ props๋ก ๋๊ฒจ์ฃผ๊ณ ํธ์ถ ์ ์ธ์๋ก ๋ค์ด์ค๋ ์ด๋ฒคํธ๊ฐ์ฒด(e)๋ฅผ ํ์ฉํด userInput ์ผ๋ก setState
index.js
handleChange = (e) => {
this.setState({ userInput: e.target.value });
};
<SearchBox handleChange={this.handleChange} />
SearchBox์ props๋ก ๋๊ฒจ์ค handleChange ๋ฉ์๋๋ฅผ ์ ์ํด์ ํจ์ ์์ฒด๋ฅผ props ๋ก ๋๊ฒจ์ฃผ์๋ค!
(์ด๊ฒ๋ ์ธ์คํ๊ทธ๋จ ๋๊ธ์์ ํด๋ณธ๊ฑฐ๋ผ ์ด๋ ต์ง ์์์!)
์๋ฌธ์๋ก ๋ฐ๊พผ monster๊ฐ์ฒด์ name๊ฐ๊ณผ userInput๊ฐ์ ๋น๊ตํ์ฌ, ์ผ์นํ๋ ๊ฐ๋ง ๋ณ์์ ์ ์ฅ ํ props๋ก ์ ๋ฌ
=> ์ฒ์์ ๋ฌธ์ ์ดํด๋ฅผ ์๋ชปํด์ ์ผ์น?===
์ด์ง~! ์ด๋ผ๊ณ ๋ฃ์๋๋ ํ๋๋ ์ถ๋ ฅ์ด ์๋๋ค.
monster์ ์ด๋ฆ์ ์ ํด์ ธ์๊ณ ,userInput
์ ๋ค์ด์ค๋ ์ ๋ณด๋ monster ์ด๋ฆ์ ์ผ๋ถ์ด๋ฏ๋ก,monster.name
์ดuserInput
์ ์์ ํ ํฌํจํด์ผ ํ๋ ๊ฑฐ์๋ค.
index.js
let filtereMonster = this.state.monsters.filter((monster) => monster.name.toLowerCase().includes(this.state.userInput.toLowerCase()));
๊ทธ๋ฆฌ๊ณ ์ฒ์์ this.state.monsters
๋ฅผ props ๊ฐ์ผ๋ก ์ ๋ฌํด ์ฃผ์๋ <CardList />
์ปดํฌ๋ํธ์ props ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์๋ค.
<CardList monsters={filtereMonster} />
๊ทธ๋ฌ๋ฉด SearchBox ์์ ํํฐ๋ง ํ, ํต๊ณผํ ์์๋ค๋ง ๋ฐํ๋๋ฏ๋ก, ์ด ํํฐ๋ง๋ ์น๊ตฌ๋ค๋ง map์ ๋๋ ค์ ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๊ฒ ๋๋ค.
filter
๋ก ๋์จ ๊ฒฐ๊ณผ๊ฐ์ props๋ก ์ ๋ฌํด์ ๋ค์map
์ ๋๋ฆฐ๋ค๋๊ฒ ์ด๋ ต๊ธฐ๋ ํ๊ณ ์ ๊ธฐํ์!!
์ข๋ง ๋ ์ผ์ฐ ์์๋ค๋ฉด ์ธ์คํ๊ทธ๋จ ๋๊ธ ์ญ์ ๋ฅผ ์์ํ๊ฒ ํ ์ ์์์ํ ๋ฐ......๐
์ ๋์ํ๋ค!!!!