Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[박인건] sprint5 #244

Conversation

parkingun
Copy link
Collaborator

@parkingun parkingun commented Dec 1, 2024

요구사항

기본

  • 중고마켓 페이지 주소는 “/items” 입니다.
  • 페이지 주소가 “/items” 일때 상단네비게이션바의 “중고마켓" 버튼의 색상은 “3692FF”입니다.
  • 상단 네비게이션 바는 이전 미션에서 구현한 랜딩 페이지와 동일한 스타일로 만들어 주세요.
  • 전체 상품에서 드롭 다운으로 “최신 순” 또는 “좋아요 순”을 선택해서 정렬을 할 수 있습니다.
  • ‘상품 등록하기’ 버튼을 누르면 “/additem” 로 이동합니다 ( 빈 페이지 )
  • 카드 데이터는 제공된 백엔드 API 페이지의 GET 메소드인 “/products”를 사용해주세요
  • 미디어 쿼리를 사용하여 반응형 view 마다 물품 개수를 다르게 보여줍니다 (서버로 요청하는 값은 동일)

심화

  • 페이지 네이션 기능을 구현합니다.
  • 반응형으로 보여지는 물품들의 개수를 다르게 설정할때 서버에 보내는 pageSize값을 적절하게 설정합니다.

주요 변경사항

스크린샷

image

멘토에게

  • 미디어 쿼리는 아직 적용하지 않았습니다. 기능 구현에 우선 집중하였습니다.
  • 페이지네이션 직접 구현하는 부분에 어려움이 있습니다.
  • 빈 이미지 출력되었을 때 어떻게 대응하는게 좋을지 궁금합니다.
  • components 별로 CSS를 구성하였습니다. 그런데 중복되는 CSS가 있을 때는 어떻게 하는게 좋을까요? 예를 들면 Common.css파일을 둬야할지 고민입니다.

@parkingun parkingun requested a review from 1005hoon December 1, 2024 23:54
@parkingun parkingun changed the title sprint5 미션 [박인건 sprint5 미션 Dec 1, 2024
@parkingun parkingun changed the title [박인건 sprint5 미션 [박인건 sprint5 Dec 1, 2024
@parkingun parkingun added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Dec 2, 2024
@parkingun parkingun changed the title [박인건 sprint5 [박인건] sprint5 Dec 2, 2024
@1005hoon
Copy link
Collaborator

1005hoon commented Dec 4, 2024

빈 이미지 출력되었을 때 어떻게 대응하는게 좋을지 궁금합니다.

이미지 경로가 잘못된 경우 fallback 이미지가 렌더되도록 fallback image url을 제공해주거나, 아에 placeholder image를 제공해주는 등 방법이 있어요. 이에 대해 한번 찾아보셔도 좋겠습니다!

components 별로 CSS를 구성하였습니다. 그런데 중복되는 CSS가 있을 때는 어떻게 하는게 좋을까요? 예를 들면 Common.css파일을 둬야할지 고민입니다.

잘 하셨어요. 여기서 중복되는 스타일이 있는경우가 다양할텐데요.
우선 공통된 형태의 콤포넌트가 있다 하면 이를 위한 콤포넌트를 만들고, 그 css를 관리하면 될거구요.
유틸리티성 스타일이 있다면 이를 위한 Common css를 작업하는것도 좋아요. 예를 들어, flex, grid, flex-column등과 같이요.

Copy link
Collaborator

@1005hoon 1005hoon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인건님! 코드 깔끔하게 잘 작성해주셨네요 ㅎㅎ
기본적인 동작 기능들은 크게 손 볼 부분은 없어보여요.
다만 확장성을 고려해본다면, 페이징 정보와 orderby 값, 그리고 에러핸들링 과 로딩상태정도가 되겠네요. 이 내용들은 이후 멘토링 타임때 더 자세하게 이야기해볼게요! 고생 많으셨습니다

Comment on lines +41 to +44
<input
className="search"
placeholder="검색할 상품을 입력해주세요."
></input>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

input처럼 self closing tag라면 <input /> 과 같이 사용해주세용

return (
<section className="allProdcutContainer">
<div className="allProducts-nav">
<h3 className="title">전체 상품</h3>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 css를 사용하고 있는데, 이처럼 generic한 클래스 이름을 사용하게 되면 이후에 style 충돌이 발생할 수 있을것 같아 우려되네요 ㅎㅎ 이번주에 배우는 스타일 활용 방법들을 한번 적용하는 방식으로 개편해봐도 좋겠어요

Comment on lines +48 to +59
<select
className="sortButton"
value={orderBy}
onChange={handleOrderChange}
>
<option className="sortOption" value="recent">
최신순
</option>
<option className="sortOption" value="favorite">
좋아요순
</option>
</select>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘 만들어주셨습니다.
조금 더 욕심내어 본다면 이 order by 값을 관리하는 기능을 따로 콤포넌트로 분리해보면 어떨까요?

Comment on lines +64 to +84
<div className="allProduct">
<img
className="productImage"
src={product.images[0]}
alt="전체 상품 이미지"
style={{
width: imageSize,
height: imageSize,
}}
/>
<div className="content">
<p className="name">{product.name}</p>
<p className="price">{product.price.toString()}</p>
<div className="favorite">
<img src={favoriteIcon} alt="좋아요 버튼" />
<p className="favoriteCount">
{product.favoriteCount.toString()}
</p>
</div>
</div>
</div>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

map되는 요소에게는 key값을 제공해주셔야 해요!
또한 이처럼 반복되는 common UI를 렌더링 하는 작업이 있다면 이것도 ui콤포넌트로 분리해보는것도 좋은 방법입니다.

// function BestProductList({ imageUrl, name, price, favoriteCount, size }) {
function BestProductList() {
const [bestProducts, setBestProducts] = useState([]);
const [orderBy, setOrderBy] = useState();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 콤포넌트에서는 orderby 가 필요하지는 않죠?

<h3 className="title">베스트 상품</h3>
<div className="bestProducts">
{bestProducts.map((product) => (
<div className="bestProduct">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

마찬가지루 key와 ui콤포넌트를 만들어 분리해주세용

Comment on lines +2 to +3
page = 1,
pageSize = 10,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

default 값 잘 설정해주셨네요 !

pageSize = 10,
orderBy = "recent",
}) {
const baseURL = "https://panda-market-api.vercel.app";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

base url의 경우, 여러곳에서 사용될 수 있으니 따로 상수값으로 관리해주는것도 좋은 방법입니다

const baseURL = "https://panda-market-api.vercel.app";

const response = await fetch(
`${baseURL}/products?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}`
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

query pararmeter를 만들때, 이렇게 수동으로 작업하기보다는 urlsearchparams를 활용해보면 어떨까요? https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams

@1005hoon 1005hoon merged commit 0993f53 into codeit-bootcamp-frontend:React-박인건 Dec 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants