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 #221

Conversation

eunkyung01
Copy link
Collaborator

@eunkyung01 eunkyung01 commented Nov 27, 2024

요구사항

기본

중고마켓

  • 중고마켓 페이지 주소는 “/items” 입니다.
  • 페이지 주소가 “/items” 일때 상단네비게이션바의 '중고마켓' 버튼의 색상은 “3692FF”입니다.
  • 상단 네비게이션 바는 이전 미션에서 구현한 랜딩 페이지와 동일한 스타일로 만들어 주세요.
  • 상품 데이터 정보는 https://panda-market-api.vercel.app/docs/#/ 에 명세된 GET 메소드 “/products” 를 사용해주세요.
  • '상품 등록하기' 버튼을 누르면 “/additem” 로 이동합니다. ( 빈 페이지 )
  • 전체 상품에서 드롭 다운으로 “최신 순” 또는 “좋아요 순”을 선택해서 정렬을 할 수 있습니다.

중고마켓 반응형

  • 베스트 상품

  • Desktop : 4개 보이기

  • Tablet : 2개 보이기

  • Mobile : 1개 보이기

  • 전체 상품

  • Desktop : 12개 보이기

  • Tablet : 6개 보이기

  • Mobile : 4개 보이기

심화

  • 페이지 네이션 기능을 구현합니다.

주요 변경사항

  • 스타일은 조금씩 추가해 갈 예정입니다!!
  • 클래스 네임은 BEM방법으로 적용하는 편인데, react로 들어오니 헷갈려서 추후 조금씩 수정할 예정입니다...

스크린샷

멘토에게

  • 컴포넌트들 마다 css파일들을 나눠뒀는데, 클래스 이름이 같으면 import하지 않은 css파일이더라도 스타일이 적용이 되는 것 같습니다. 이럴때는 css파일을 모듈화하는 편이신지 아니면 클래스 이름을 중복되지 않게 하시는지 궁금합니다...!
  • 페이지에서 하단에 < 1 2 3 4 5 > 버튼을 만들어뒀는데 6으로 넘어간 이후에 어떻게 구현을 해야할지 감이 안잡혀서, 조언을 해주셨으면 좋겠습니다 ㅎㅎ...

@eunkyung01 eunkyung01 requested a review from Lanace November 27, 2024 05:38
@eunkyung01 eunkyung01 added the 순한맛🐑 마음이 많이 여립니다.. label Nov 27, 2024
Comment on lines -5 to -26
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.

Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
Copy link
Collaborator

Choose a reason for hiding this comment

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

아에 과감하게 다 지워버리셨군요ㅋㅋ
기본값으로 제공되는거라 있으면 좋은것도 있고 (meta viewport, manifest 등)
아에 내용을 바꿔주어야 하는 부분도 있고 (description, icon 등)

기존에 og 태그 넣으셨던거 가져와서 여기에 넣어주는것도 좋을것같아요ㅎㅎ!

Copy link
Collaborator

Choose a reason for hiding this comment

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

아 그래도 사용하지 않는 리소스 파일을 삭제해주는건 매우 좋아요ㅎㅎ!

Comment on lines +9 to +16
<BrowserRouter>
<Header />
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="/items" element={<UsedMarketPage />} />
<Route path="/additem" element={<PostProductPage />} />
</Routes>
</BrowserRouter>
Copy link
Collaborator

Choose a reason for hiding this comment

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

오 깔끔하게 잘 하셨는데요ㅋㅋ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

이거는 파일명만 바꾸면 좋을것같아요ㅋㅋ
한글 파일을 쓰는 경우에 가끔 인코딩 문제같은게 생길떄가 있어서ㅠㅠㅠ

Comment on lines +6 to +11
const query = `page=${page}&pageSize=${pageSize}&orderBy=${orderBy}`;
const response = await fetch(
`https://panda-market-api.vercel.app/products?${query}`
);
const data = await response.json();
return data;
Copy link
Collaborator

Choose a reason for hiding this comment

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

오~ 이거 진짜 잘만드셨네요!
디폴트값도 처리하시구...!

위에 있는것도 충분히 잘 짠 코드긴 한데, 문제가 있어요ㅠ

  1. query params가 추가될떄마다 query가 지저분해 질꺼에요.
  2. query params가 없는 경우는 사용할 수 없어요.

그래서 이렇게 고쳐볼 수 있어요!

export async function getProduct({
  page = 1,
  pageSize = 4,
  orderBy = "favorite",
}) {
  // 기본 URL 설정
  const baseURL = "https://panda-market-api.vercel.app/products";

  // URL 객체 생성
  const url = new URL(baseURL);

  // URLSearchParams를 사용해 쿼리 파라미터 추가
  url.searchParams.set("page", page);
  url.searchParams.set("pageSize", pageSize);
  url.searchParams.set("orderBy", orderBy);

  // API 호출
  const response = await fetch(url.toString());
  const data = await response.json();
  return data;
}

const [orderBy, setOrderBy] = useState("recent");
const [page, setPage] = useState(1);
const handleLoad = async (value) => {
let result = await getProduct(value);
Copy link
Collaborator

Choose a reason for hiding this comment

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

매우 짜치긴 하지만...ㅋㅋ;;

상수는 const 를 쓰는 습관을 들이면 좋아요ㅎㅎ!

const result = await getProduct(value);

Copy link
Collaborator

Choose a reason for hiding this comment

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

보니까 component 폴더에 각각 css 랑 js 를 같은 폴더에 모아둔것같아요...!

그럼 혹시 각 컴포넌트를 폴더에 넣고 js랑 css를 쌍으로 넣으면 어떨까요?

📦 components
┣ 📂 AllProduct  
┃ ┣ 📜 AllProductItem.js  
┃ ┣ 📜 AllProductItem.css  
┃ ┣ 📜 AllProductList.js  
┃ ┗ 📜 AllProductList.css  
┣ 📂 BestProduct  
┃ ┣ 📜 BestProductItem.js  
┃ ┣ 📜 BestProductItem.css  
┃ ┣ 📜 BestProductList.js  
┃ ┗ 📜 BestProductList.css  
┣ 📂 Navigation  
┃ ┣ 📜 Header.js  
┃ ┣ 📜 Header.css  
┃ ┣ 📜 NavBar.js  
┃ ┗ 📜 NavBar.css  
┗ 📂 Pagination  
  ┣ 📜 PageButton.js  
  ┗ 📜 PageButton.css  

<NavBar handleOrder={handleOrder} />
<div className="allproduct-list">
{items.map((item) => {
return <AllProductItem key={item.id} item={item} />;
Copy link
Collaborator

Choose a reason for hiding this comment

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

오? key까지 잘 써주셨네요ㅋㅋ!
잘 하셨네여ㅎㅎ

setItems(list);
};
useEffect(() => {
handleLoad({ page, pageSize: 10, orderBy });
Copy link
Collaborator

Choose a reason for hiding this comment

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

여기에 pageSize 도 상태값으로 관리하면 어떨까요??

handlePage(page + 1);
};

const PageGroup = [1, 2, 3, 4, 5];
Copy link
Collaborator

Choose a reason for hiding this comment

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

페이지가 6이 넘어갔을때 처리는 여기서 하면 되겠네요ㅎㅎ!

지금은 1~5까지 고정으로 보이는데, 이 숫자들은 props로 내려오는 page 값에 따라서 바꿔주면 되겠네요!

page값을 기준으로 5개가 나오도록이요

@Lanace
Copy link
Collaborator

Lanace commented Nov 27, 2024

컴포넌트들 마다 css파일들을 나눠뒀는데, 클래스 이름이 같으면 import하지 않은 css파일이더라도 스타일이 적용이 되는 것 같습니다. 이럴때는 css파일을 모듈화하는 편이신지 아니면 클래스 이름을 중복되지 않게 하시는지 궁금합니다...!

React에서도 BEM 로 물론 할 수 있습니다!
그치만 이번에 경험해보셨겠지만 어떤 컴포넌트에 어떤 스타일이 있을지 모르는 상황에서 잘못하면 사이드 이펙트가 발생할 수 있을꺼에요ㅠ

그래서 사실 지금까지 해오셨던것처럼 전역에 적용되는 import "./component.css" 처럼 가져오는게 아니라 아래와 같이 module css 방식을 많이 사용해요!

import style from './Button1.module.css'

export default function Button({size}) {
    if (size==='big') {
        return <button className={`${style.button} ${style.big}`}>큰 버튼</button>
    } else {
        return <button className={`${style.button} ${style.big}`}> 작은 버튼</button>
    }
}

이밖에도 css in js 같이 jsx 코드에 css 코드를 삽입하기도 하구요ㅎㅎ!
이건 다음 멘토링떄 한번 같이 보시져ㅎㅎ!

페이지에서 하단에 < 1 2 3 4 5 > 버튼을 만들어뒀는데 6으로 넘어간 이후에 어떻게 구현을 해야할지 감이 안잡혀서, 조언을 해주셨으면 좋겠습니다 ㅎㅎ...

이부분은 위에 리뷰에도 남겨두긴 했는데, props로 넘어오는 page 를 이용해서 앞위로 숫자 5개가 나오게끔 처리하면 아마 하실 수 있을거에요!

참고로 함수를 호출해서 가져오는것도 가능해요!ㅎㅎ

  const PageGroup = generatPagenavigations(currentPage);

이런식으루요ㅎㅎ!
generatPagenavigations 함수 정의는 한번 해보시면 좋을것같아요!
이런거 짜보면서 알고리즘 공부도 같이 할 수 있어서ㅋㅋ

전체적으로 깔끔하게 잘 작성하신것같습니다ㅎㅎ
고생 많으셨어요ㅠ

@Lanace Lanace merged commit 7ec9c0a into codeit-bootcamp-frontend:React-김은경 Nov 27, 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