피드를 여러개 띄우고 싶으면 <Feed/>
를 여러번 복사하면 되지 않을까? 생각할 수도 있지만 그렇게 하면 데이터를 동적으로 다루고 props로 넘겨줘야할 때 굉장히 비효율적이기 때문에 우리는 mockData를 활용해야한다.
실습을 통해 연습해보자
{
"feedData": [
{
"feedId": 1,
"username": "seeyong_0",
"feedImages": [
{
"imgId": 105,
"imgUrl": "/images/mycats.png"
}
],
"content": "귀여운 냥이들🐱💗"
},
{
"feedId": 2,
"username": "seeyong_0",
"feedImages": [
{
"imgId": 106,
"imgUrl": "/images/bibi.jpeg"
}
],
"content": "혀 넣는거 까먹은 비비👅"
}
]
}
function Main(){
const [feeds, setFeeds] = useState([]);
return(...)
}
function Main(){
const [feeds, setFeeds] = useState([]);
useEffect(() => {
fetch("/data/feeds.json")
.then((res) => res.json())
.then((data) => {
setFeeds(data.feedData);
});
});
return(...)
}
useEffect(()=>{},[])
라고 표기해준다.fetch("/data/feeds.json")
fetch 함수로 feed.json 파일을 받아온다..then((res) => res.json())
response 객체를 json 형태로 바꿔준다..then((data) => {setFeeds(data.feedData);});
feed.json의 데이터를 받아서 state에 넣어준다. feeds 에 담긴 객체 하나 = 피드 한개 이므로 객체의 개수 만큼 피드들이 출력되어야 한다.
<div className="Feed-wrapper">
{feeds.map((feed) => {
return <Feed key={feed.feedId} feedData={feed} />;
})}
</div>
<Feed key={feed.feedId} />
map함수를 돌리기 위해서는 key값이 있어야한다. <Feed key={feed.feedId} feedData={feed} />
feedData라는 이름으로 map함수로 받아온 feed를 props로 넘겨준다.function Feed({ feedData }){
console.log(feedData)//feedData:{feedId:..}
...
}
<div className="feed-header">
<img src="/images/user.png" alt="user-profile" />
{feedData.username}
</div>
feed-header
에 {feedData.username}
로 username을 넣어줬다.<div className="feed-imag-container">
<img src={feedData.feedImages[0].imgUrl}
className="feed-img"
alt="고양이>
</img>
</div>
{feedData.feedImages[0].imgUrl}
feedImages도 배열로 되어있기 때문에 인덱스에 접근한 후 imgUrl에 접근해야한다.<div className="feed-content-container">
<span>{feedData.content}</span>
</div>
1) Main에서 Feed의 정보를 받아오고
2) state를 통해서 받아온 정보를 저장하고
3) map함수로 저장한 정보를 가지고 동적으로 컴포넌트를 여러개 그리고
4) 그릴 때 마다 하나의 컴포넌트에 저장한 정보를 props로 넘겨줘서 feed를 완성했다.