데이터를 props로 내리는 과정에서 첫번째 컴포넌트로는 무사하게 넘겼으나 다음 컴포넌트로는 원하는데로 보내지를 못했다.
const Main = () => {
const [data, setData] = useState([]);
const [selectedCategory, setSelectedCategory] = useState('');
useEffect(() => {
fetch('http://localhost:3000/data/MockData.json')
.then(res => res.json())
.then(data => {
setData(data);
});
}, []);
데이터를 fetch
하여 가져온 후 useState
로 배열에 담아 놓는다.
return (
<StyledMain>
<StyledBannerWrap>
<StyledVideo> 동영상 </StyledVideo>
<StyledCarousel>
<CarouselBanner />
</StyledCarousel>
</StyledBannerWrap>
<StyledSearchBar>
<StyledInput type="search" placeholder="🔍️ 오늘의집 통합검색" />
</StyledSearchBar>
<StyledRecommendCarousel>
<RecommendFoodCarousel data={data} />
</StyledRecommendCarousel>
<StyledFoodCategory>
{categoryInfo.map((value, i) => (
<CategoryCard
key={i}
value={value}
selectedCategory={selectedCategory}
setSelectedCategory={setSelectedCategory}
/>
))}
</StyledFoodCategory>
<CategoryRestaurantList data={data} />
</StyledMain>
);
<CategoryRestaurantList data={data} />
보내고 싶은 컴포넌트에 props로 내려 준 후 data={data}
이 데이터를 다음 컴포넌트에서 map해준다.
const CategoryRestaurantList = ({ data }) => {
return (
<StyledRecommendCard>
{data.map((value, i) => (
<div key={i} style={{ width: '25%' }}>
<RecommendFoodCard key={i} value={value} />
</div>
))}
</StyledRecommendCard>
);
};
({ data })
객체로 받아와야 하는데 처음에 그냥 const CategoryRestaurantList = data => {}
이렇게 props로 받아와 원하는 상태로 받아오지 못했다.
`{data.map((value, i) => (
<div key={i} style={{ width: '25%' }}>
<RecommendFoodCard key={i} value={value} />
</div>`
그 다음 그 데이터를 바로 map
해주면 된다. 그 다음 이 데이터를 그대로 다음의 컴포넌트 RecommendFoodCard
에 보내주기 위해 객체 하나하나를 value={value}
담아 다음 컴포넌트로 보내준다.
그래야 내가 사용 할 수 있는 객체 하나하나의 형태로 데이터가 넘어오게 된다.
그 다음으로 객체의 key를 사용해주면 된다.
const RecommendFoodCard = ({ value }) => {
const [isBookMark, setIsBookMark] = useState(false);
console.log(value);
return (
<StyledRecommend>
<StyledRecommendCard>
<StyledRecommendCardImg art="restaurant" src={value.thumbnail_image} />
{isBookMark ? (
<i
onClick={() => setIsBookMark(!isBookMark)}
className="fa-solid fa-bookmark"
/>
) : (
<i
onClick={() => setIsBookMark(!isBookMark)}
className="fa-regular fa-bookmark"
/>
)}
</StyledRecommendCard>
<StyledRestaurant>{value.name}</StyledRestaurant>
<StyledRestaurantMenu>{value.address}</StyledRestaurantMenu>
</StyledRecommend>
);
};
({ value })
props로 받아오고 원하는 위치에서
<StyledRecommendCardImg art="restaurant" src={value.thumbnail_image} />
객체의 이미지
<StyledRestaurant>{value.name}</StyledRestaurant> <StyledRestaurantMenu>{value.address}
주소와 이름 같은 형식으로 사용 해주면 된다. 데이터가 넘어 올 때 마다 객체인지 배열인지를 정확히 확인하고 사용해야 한다. 다시한번 디버깅의 중요성을 알게되었다.