1.
{title.map((item, index) =>
{return <div key={index}>
<div className='list' key={index}>
<h4>{item} <span onClick={() => {let copy = [...like]; copy[index]++; setLike(copy)}}>๐</span>{like[index]}</h4>
</div>
<p>{day[index]}</p>
</div>})}
Warning: Each child in a list should have a unique "key" prop.
๋ง์ฝ key ์์ด ๋ฐฐ์ด์ ๋ ๋๋งํ๋ค๋ฉด, ๋ฐฐ์ด์ 1๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ ์ถ๊ฐ๋๋ ์ํฉ์ด๋ผ๋ React๋ N+1๊ฐ์ ์ ์ฒด ์์๋ฅผ ์ฒ์๋ถํฐ ๋ฆฌ๋ ๋๋งํ๋ค๊ณ ํ๋ค. ํ์ง๋ง key๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ์กด ์์๊ฐ ๋ฐ๋์ง ์์ผ๋ฉด ๊ทธ๋๋ก ๋๊ณ , ์๋ก ์๊ธฐ๋ ์์๋ง ๋ฆฌ๋ ๋๋งํ๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ <div className='list' key={index}>์ ๊ฐ์ด key๋ฅผ ๋ฃ์๋ค.
์ฐพ์๋ณด๋ array index๋ฅผ key๋ก ์ฃผ๋ ๊ฒ์ ๋ฆฌ์กํธ๋ ์ง์ํ๋ค๊ณ ํ๋๋ฐ...
[React] ๋ฐฐ์ด์ index๋ฅผ key๋ก ์ฐ๋ฉด ์๋๋ ์ด์
React ๊ณต์ Document๋ฅผ ๋ณด๋ค๊ฐ ์๋ ๋ ธ๋์์ผ๋ก ์บก์ณํ ๋ถ๋ถ์ ๋ณด๊ฒ ๋์๊ณ ํ์ธํ ์ฌํญ๋ค์ ์ ๋ฆฌํฉ๋๋ค.
medium.com
์ ๋งํฌ์์ ์ด์ ๋ฅผ ํ์ธํ ์ ์์๋ค.
2. public ํด๋
[React] ๋ฆฌ์กํธ์์ ์ด๋ฏธ์ง ๊ฒฝ๋ก ์ค์ ํ๊ธฐ (public, src ๋๋ ํ ๋ฆฌ ์ฐจ์ด)
public ๋๋ ํ ๋ฆฌ VS. src ๋๋ ํ ๋ฆฌ
bokjiho.medium.com
์์ ๊ฐ์ด ํผ๋ธ๋ฆญ ํด๋์ ์ด๋ฏธ์ง๋ค์ ๋ฃ์ด๋๋ค.
์ด๋ฅผ ์ปดํฌ๋ํธ์์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๊ฒฝ๋ก๋ฅผ ์์ฑํ ๋,
ํผ๋ธ๋ฆญ ํด๋์ ๋ฃ์ด๋๋ฉด ๊ฒฝ๋ก๋ฅผ ์๋ตํด๋ ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
<img src="img/yb1.jpg" className="w-25" alt="๋ชจ์" />
์์ ๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๐ public directory
- ์ ์ ํ์ผ์ ๋ฃ๋ ๋๋ ํ ๋ฆฌ (index.html์ ๋น๋กฏํ html ํ์ผ, img ๋ฑ)
-public ๋๋ ํ ๋ฆฌ์ ๋ฃ์ ํ์ผ์ webpack์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๊ณ , ์๋ณธ์ด build ํด๋์ ๋ณต์ฌ๋๋ค.
-ํ์ผ์ด ํ์ฒ๋ฆฌ(post-process) ๋๊ฑฐ๋ ๊ฒฝ๋ํ(minify)๋์ง ์์
-ํ์ผ ๊ฒฝ๋ก๋ฅผ ์๋ชป ์
๋ ฅํ๊ฑฐ๋, ํด๋น ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ปดํ์ผ ๋จ๊ณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ณ , ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ๋ 404 ์ค๋ฅ๋ฅผ ์๋ต๋ฐ๊ฒ ๋จ
-๊ฒฐ๊ณผ ํ์ผ๋ช
์ content hash๊ฐ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์, ํ์ผ์ด ์์ ๋ ๋ ๋ง๋ค ์ง์ ํ์ผ๋ช
์ ์์ ํ๊ฑฐ๋ ๋งค๊ฐ๋ณ์ ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผ ํจ
3.json ์ฌ์ฉํ๊ธฐ
let data = [
{
id : 0,
title : "NM HAIRY BEANIE",
content : "Born in France",
price : 120000,
img : 'img/yb2.jpg'
},
{
id : 1,
title : "FLARE Knit Beanie",
content : "Born in Seoul",
price : 110000,
img : 'img/yb3.jpg'
},
{
id : 2,
title : "SOFT BUCKET HAT WHITE",
content : "Born in the states",
price : 130000,
img : 'img/yb4.jpg'
}
]
export default data;
์์ ๊ฐ์ JSํ์ผ์ด ์๋ค. export default data;์ ์ํด ๋ค๋ฅธ ํ์ผ์์ data๋ก importํด์ฌ ์ ์๋ค.
import data from './data'
์ด๋ ๊ฒ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฐ์ด๋ฏ๋ก state๋ก ๊ด๋ฆฌํด์ค๋ค.
let [Data, setData] = useState(data);
ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด mapํจ์๋ฅผ ๋๋ฆฌ๋ ์ฝ๋
<div className='container'>
<div className='row'>
{Data.map((item, index) => {
return <div key={index} className='col-md-4'>
<img src={item.img} className='img-fluid' alt='yb'/>
<h4>{item.title}</h4>
<p>{item.content}</p>
<p>{item.price}</p>
</div>
})}
</div>
</div>
ํด๋น ์ฝ๋๋ฅผ ํ์ฉํด ๋ง๋ ๋ถํธ์คํธ๋ฉ ์ฌ์ดํธ
์ฌ์ง์ ๋ชจ๋ ์ฐ๋ฆฌํ์์ด๋ผ ๋ชจ์์ดํฌ^__^
'๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฌ : JavaMailSenderImpl cannot be resolved to a type (0) | 2022.12.29 |
---|---|
๋ฆฌ์กํธ 3์ผ์ฐจ : useNavigate, react-route-dom (1) | 2022.12.28 |
๋ฆฌ์กํธ 1์ผ์ฐจ : mapํจ์๋ฅผ ์ด์ฉํ ๊ฐ๋ณ ์ข์์ ๊ตฌํ (4) | 2022.12.26 |
์คํ๋ง๋ถํธ ์์ํ๊ธฐ (0) | 2022.08.23 |
210829 ํธ์ํฐ ํด๋ก ์ฝ๋ฉ ์ค ๋ฉ๋ชจ (0) | 2021.08.29 |