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

[김영주] Sprint6 #190

Merged

Conversation

purplenib
Copy link
Collaborator

@purplenib purplenib commented Jun 28, 2024

요구사항

  • Github에 PR(Pull Request)을 만들어서 미션을 제출합니다.
  • 피그마 디자인에 맞게 페이지를 만들어 주세요.
  • React를 사용합니다

기본

  • 상품 등록 페이지 주소는 “/additem” 입니다.
  • 페이지 주소가 “/additem” 일때 상단네비게이션바의 '중고마켓' 버튼의 색상은 “3692FF”입니다.
  • 상품 이미지는 최대 한개 업로드가 가능합니다.
  • 각 input의 placeholder 값을 정확히 입력해주세요.
  • 이미지를 제외하고 input 에 모든 값을 입력하면 ‘등록' 버튼이 활성화 됩니다.
  • API를 통한 상품 등록은 추후 미션에서 적용합니다.

심화

  • 이미지 안의 X 버튼을 누르면 이미지가 삭제됩니다.
  • 추가된 태그 안의 X 버튼을 누르면 해당 태그는 삭제됩니다.

변경사항

feat

  • AddItem 페이지 기본 기능 구현
  • AddItem 페이지 심화 기능 구현

fix

  • 특정 페이지를 렌더링하지 않는 오류 개선

rename

  • 미션5 리뷰 내용 반영하여 폴더 구조 정리

refactor

  • ItemContainer 컴포넌트 마크업 수정

design

  • Items 페이지의 타블렛, 모바일 사이즈 미디어 쿼리 적용
  • AddItem 페이지의 타블렛, 모바일 사이즈 미디어 쿼리 적용
  • 피그마 시안과 다른 디자인 부분(특정 태그 폰트 미적용, pageNavBar 레이아웃) 수정

스크린샷

스크린샷 2024-06-28 234836


스크린샷 2024-06-28 234851


스크린샷 2024-06-28 234814


image


멘토에게

  • AddItem 페이지의 컴포넌트를 ItemDetails(아이템 정보), ItemImageUpload(이미지 등록 및 삭제 기능), ItemTags(태그 추가 및 삭제 기능)로 분리해봤습니다. 관심사의 분리가 잘 이루어진 건지 모르겠습니다.

  • ItemDetails(아이템 정보 입력) 컴포넌트는 특별한 기능은 없지만 코드 길이가 길어지는 것 때문에 분리했는데, 불필요하게 분리한 걸까요? 단순히 코드가 길어지는 것 때문에 컴포넌트를 분리하기도 하나요?

  • 컴포넌트를 나누다보니 프롭 리프팅을 자주 사용하게 되는 것 같습니다. 프롭 드릴링 문제를 예방하려면, 프롭 리프팅은 어느정도 사용하는 게 적절할까요? 가이드 라인이 있는지 궁금합니다!

  • mediaquery.css 파일 안에 Items 페이지의 미디어쿼리 디자인, AddItem 페이지의 미디어쿼리 디자인이 함께 적용되어 있는데 다른 방식으로 분리하는 것이 나을까요? mediaquery.css를 삭제한 후 Items.css 파일과 AddItem.css 파일에 분리해서 미디어쿼리를 적용하는 방식이 더 나을지 모르겠습니다.

  • pages 폴더 안에 각 페이지에 해당하는 CSS 파일을 만들었습니다. 이후 각 페이지에 맞는 CSS 파일만을 import해서 사용하려는데, CSS 파일이 의도대로 적용되지 않습니다. 가령 AddItem.jsx에 AddItem.css를 import했고, 상위 컴포넌트에는 global.css만 import했는데 관련 없는 Items.css가 적용되는 문제가 있습니다.

@purplenib purplenib added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 28, 2024
@purplenib purplenib requested a review from wlgns2223 June 28, 2024 14:50
@wlgns2223
Copy link
Collaborator


AddItem 페이지의 컴포넌트를 ItemDetails(아이템 정보), ItemImageUpload(이미지 등록 및 삭제 기능), ItemTags(태그 추가 및 삭제 기능)로 분리해봤습니다. 관심사의 분리가 잘 이루어진 건지 모르겠습니다.


제 생각에는 잘 분리되었다고 생각합니다. 유저입장에서 보면 이미지를 업로드하는 기능과 그 외의 텍스트 입력 기능을 따로 볼 수 있고
컴포넌트를 분리함으로써 연관된 상태 및 핸들러들끼리 모여있게 되어 있으니 잘 된것 같아요.

@wlgns2223
Copy link
Collaborator

temDetails(아이템 정보 입력) 컴포넌트는 특별한 기능은 없지만 코드 길이가 길어지는 것 때문에 분리했는데, 불필요하게 분리한 걸까요? 단순히 코드가 길어지는 것 때문에 컴포넌트를 분리하기도 하나요?

코드가 길어지면 컴포넌트로 만들어서 따로 관리하기도 합니다. 그럴때는 연관된 핸들러 및 상태들을 함께 컴포넌트 내부로 옮기는 시도를 합니다.
예를들면

const handleDetailsChange = (e) => {
    const { name, value } = e.target;
    setItemDetails((prevDetails) => ({
      ...prevDetails,
      [name]: value,
    }));
  };

  const handleTagsChange = (newTags) => {
    setItemDetails((prevDetails) => ({
      ...prevDetails,
      itemTags: newTags,
    }));
  };

위 두 코드는 아이템 디테일 컴포넌트에 props로 넘겨주고 있죠? 이 두 함수는 공통적으로 setItemDetails를 내부에서 사용하고 있습니다.
그렇다면 setItemDetails 하나만 props로 넘겨주고 두 함수는 ItemDetails 컴포넌트 내부에서 정의하면 되죠.
그럼 props도 2개에서 하나로 줄고 부모컴포넌트에서 코드가 좀 더 줄어듭니다.

@wlgns2223
Copy link
Collaborator

컴포넌트를 나누다보니 프롭 리프팅을 자주 사용하게 되는 것 같습니다. 프롭 드릴링 문제를 예방하려면, 프롭 리프팅은 어느정도 사용하는 게 적절할까요? 가이드 라인이 있는지 궁금합니다!

프롭 리프팅이 프롭스를 부모컴포넌트로 옮기는 것을 말씀하시나요?

@wlgns2223
Copy link
Collaborator

mediaquery.css 파일 안에 Items 페이지의 미디어쿼리 디자인, AddItem 페이지의 미디어쿼리 디자인이 함께 적용되어 있는데 다른 방식으로 분리하는 것이 나을까요? mediaquery.css를 삭제한 후 Items.css 파일과 AddItem.css 파일에 분리해서 미디어쿼리를 적용하는 방식이 더 나을지 모르겠습니다.

저는 후자처럼 items.css, addItems.css로 분리하여 관리하는게 낫다고 생각합니다. 개발을 할때 항상 집중 할 곳을 명확하게 찾을 수 있어야하고, 불필요하게 관련없는 코드를 볼 필요없어야합니다.

@purplenib
Copy link
Collaborator Author

purplenib commented Jun 29, 2024

프롭 리프팅이 프롭스를 부모컴포넌트로 옮기는 것을 말씀하시나요?

공식 문서를 보니 Lifting State Up이 맞는 표현 같습니다! 용어를 잘못 알고 있던 부분이었습니다.

type="file"
id="ImgUpload"
name="ImgUpload"
accept="image/*"
Copy link
Collaborator

Choose a reason for hiding this comment

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

이미지만 받을 수 있도록 accept 속성을 적어주셨네요 !

Comment on lines +20 to +33
const handleDetailsChange = (e) => {
const { name, value } = e.target;
setItemDetails((prevDetails) => ({
...prevDetails,
[name]: value,
}));
};

const handleTagsChange = (newTags) => {
setItemDetails((prevDetails) => ({
...prevDetails,
itemTags: newTags,
}));
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

질문주신것과 같이 이 부분은 itemDetails로 옮기는게 좀 더 응집도가 있을 수 있습니다 ^^

return (
<section className="item-details">
<div className="item-detail-container">
<label className="section-title">상품명</label>
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
<label className="section-title">상품명</label>
<label htmlFor={아이디를 적어주세요} className="section-title">상품명</label>

</div>

<div className="item-detail-container">
<label className="section-title">상품 소개</label>
Copy link
Collaborator

Choose a reason for hiding this comment

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

label과 연관있는 요소의 아이디를 작성해주세요.

Suggested change
<label className="section-title">상품 소개</label>
<label htmlFor="itemDescription" className="section-title">상품 소개</label>

const handleAddTag = (e) => {
if (e.key === "Enter" && tagInput.trim()) {
e.preventDefault();
onTagsChange([...tags, tagInput.trim()]);
Copy link
Collaborator

Choose a reason for hiding this comment

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

불변성을 지키면서 새로운 원소를 추가하신 점 잘 하셨습니다 !

};

const handleRemoveTag = (index) => {
onTagsChange(tags.filter((element, i) => i !== index));
Copy link
Collaborator

Choose a reason for hiding this comment

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

지금은 문제없이 작동할테지만 인덱스보다는 element로 필터링을 하는게 좀 더 안전할 것 같다는 생각이 들어요.

@wlgns2223
Copy link
Collaborator

컴포넌트를 나누다보니 프롭 리프팅을 자주 사용하게 되는 것 같습니다. 프롭 드릴링 문제를 예방하려면, 프롭 리프팅은 어느정도 사용하는 게 적절할까요? 가이드 라인이 있는지 궁금합니다!

이런 경우를 위해서 상태관리 라이브러리를 많이 사용합니다. 추후에 배우실 예정이고 Zustand라는 상태관리 라이브러리를 많이 쓰는 추세더라구요.

@wlgns2223 wlgns2223 merged commit e637149 into codeit-bootcamp-frontend:React-김영주 Jun 29, 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.

3 participants