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

Conversation

naynara87
Copy link
Collaborator

@naynara87 naynara87 commented Jun 28, 2024

스프린트 6미션

요구사항

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

기본

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

심화

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

스크린샷

image

멘토에게

  • 기능 만드는데 정신 없어서 코드 컴포넌트 정리 못했습니다.
  • scss 정리 못했어요. 코드리뷰 후 같이 해보겠습니다.

@naynara87 naynara87 changed the base branch from main to React-나윤주 June 28, 2024 07:00
@naynara87 naynara87 requested a review from Taero-Kim June 28, 2024 07:00
@naynara87 naynara87 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 28, 2024
</ul>
) : (
<p className="list-none">상품이 없습니다.</p>
)}
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
JSX 리턴부에서 삼항연산자가 중첩되면 가독성이 확 떨어져보입니다!
요거는 Loading과 Product들을 보여주는 부분으로 삼항연산자를 구분하고.

Product 보여주는 부분에서 위처럼 분기가 필요하다면, 따로 위에서 변수로 선언하여 사용하는게 좋을 것 같아요!

const AllProductList = () => {
  ...
  const ProductList = products.length > 0 ? (
      <ul className="product-list">
        {products.map(product => (
          <li key={product.id}>
            <ProductCard product={product} />
          </li>
        ))}
      </ul>
    ) : (
      <p className="list-none">상품이 없습니다.</p>
    );

  ...

  return (
    <>
        {loading ? <Loadingbar /> : ProductList}
    </>
  )
}

@@ -0,0 +1,14 @@
function Loadingbar() {
return (
<div class="load-wrapp">
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
class는 자바스크립트에서 예약어이기 때문에, jsx에서 className으로 사용하셔야 합니다!

이미 아시는데, 깜박하신 것 같네용

const handleTagRemove = tagToRemove => {
const updatedList = tagList.filter(tag => tag !== tagToRemove);
setTagList(updatedList);
onTagListChange(updatedList);
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
현재 AddItem.js에서 관리하고 있는 tag 리스트가 있어서
사실상 TagInput 컴포넌트에서 중복해서 tagList 상태를 관리할 필요가 없어보여요!

부모에 있는 values의 tags를 사용하면 충분히 상태 하나로 관리가 가능하고,
이렇게 setTagList가 발생할 때마다 onTagListChange가 동일하게 호출되는 일이 없을 것 같아요!

};

useEffect(() => {
if (reset) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
reset 이라는 상태도 제가 이해하기론 showTagList 상태와 동일하게 따라가는 것 같아요.
결과적으로 reset, tagList 모두 부모 컴포넌트에서 하나로 관리하는게 좋을 것 같아요!

setShowTagList(false);
onTagListChange([]); // 부모 컴포넌트에 빈 태그 목록 전달
}
}, [reset]);
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
react에서 setState 역할을 하는 것 제외하고는,
useEffect에 사용된 함수들도 deps에 작성해주어야 하는 것이 원칙적으로 맞습니다!

지금 상황에서는 deps를 생략해도 기능적으로 크게 문제가 있는건 아니지만
이렇게 deps를 생략하다보면 나중에 예상치 못한 부분에서 사이드이펙트가 발생합니다.

deps를 모두 지정하는 습관을 들이면 좋을 것 같아요!
참고로 onTagListChange라는 함수를 그냥 그대로 deps에 넣어버리면
함수가 계속 재생성되고, 그에 따라 useEffect가 계속 발동되기 때문에
onTagListChange를 useCallback등으로 감싸시는게 좋습니다!

);
}

export default TagInput;
Copy link
Collaborator

Choose a reason for hiding this comment

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

실제로 태그 부분 인터페이스를 보니까 이쁘고 부드럽게 잘 구현하신 것 같아요!!👍

type="text"
name="tag"
placeholder="태그를 입력 후 Enter를 눌러 추가하세요"
value={tagInput}
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
요거는 tagInputValue 등의 변수명을 사용하는게 더 적절할 것 같아용!

} else {
setIsFormValid(false);
}
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
isFormValid, setIsFormValid 요 부분을 보면서,
멘토링 때 언급 드렸던 것을 한 번 리마인드 해봅시다!

잘 생각해보면 isFormValid라는 상태는
사실상 이미 상태로 관리하고 있는 values 객체의 값들에 의해 계산되는 애죠?

요런 경우에는 isFormValid라는 상태를 정의하고
그때 그때 업데이트 하는 대신
values의 업데이트에 따라 isFormValid가 계산되도록 하면 더 좋을 것 같아요!

이럴때 보통 useMemo 훅을 많이 사용합니다.

const [values, setValues] = useState({
    imgFile: '',
    product: '',
    content: '',
    price: 0,
    tag: [],
  });

const isFormValid = useMemo(() => {
  const { product, content, price, tag } = values; 
  
  return (product !== '' && content !== '' && price !== 0 && tag.length > 0)
}, [values])

if (resetTagInput) {
setResetTagInput(false);
}
}, [resetTagInput]);
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
resetTagInput의 변경을 감지하고
resetTagInput이 true가 되었을 때, resetTagInput을 다시 false로 변경한다.

이 useEffect를 어떤 의도로 작성하신건가용?

Copy link
Collaborator Author

@naynara87 naynara87 Jun 30, 2024

Choose a reason for hiding this comment

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

p3; resetTagInput의 변경을 감지하고 resetTagInput이 true가 되었을 때, resetTagInput을 다시 false로 변경한다.

이 useEffect를 어떤 의도로 작성하신건가용?

submit 버튼 누르면 리셋이 되는데 그때 사실 api post? 보내는 역할을 할껀데.. 아직 api 연결은 안해서.. 그냥 리셋을 false 한다라고 설정만 해둔 상태입니다.

</div>
</form>
</section>
</main>
Copy link
Collaborator

Choose a reason for hiding this comment

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

p4;
요번에 시간이 없으셔서 못하셨지만, Form에 있는 각각의 인풋 아이템들을 컴포넌트화하면 더 깔끔할 것 같아요!

@Taero-Kim
Copy link
Collaborator

윤주님 고생하셨습니다!
항상 코드적으로도 고민 많이 하시면서, 이것 저것 시도해보시려고 하시는 것 같아서 좋습니다!

어떤 훅을 언제 어떻게 써야하는지, 요런거는 사실 정답이 있는 것도 아니고
여러가지 문제 해결 상황을 마주하다보면 자연스럽게 터득하게 되실테니 걱정마시고 지금처럼만 꾸준히 해봐요!

@Taero-Kim Taero-Kim merged commit f8620eb into codeit-bootcamp-frontend:React-나윤주 Jun 29, 2024
@naynara87
Copy link
Collaborator Author

naynara87 commented Jun 30, 2024

윤주님 고생하셨습니다! 항상 코드적으로도 고민 많이 하시면서, 이것 저것 시도해보시려고 하시는 것 같아서 좋습니다!

어떤 훅을 언제 어떻게 써야하는지, 요런거는 사실 정답이 있는 것도 아니고 여러가지 문제 해결 상황을 마주하다보면 자연스럽게 터득하게 되실테니 걱정마시고 지금처럼만 꾸준히 해봐요!

기능만 정신없이 만들어서 조금 빈약한 부분이 있습니다.
전체적으로 커밋 메세지도 잘 못넘겨서 리셋한 다음에 피드백 부분 수정해서 다시 올려보겠습니다.
시행착오 없이 자연스럽게 useHook/conponents 을 정리하는 날이 오면 좋겠습니다.
감사합니다.

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