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

Conversation

naynara87
Copy link
Collaborator

@naynara87 naynara87 commented Jul 2, 2024

스프린트 6미션

요구사항

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

기본

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

심화

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

스크린샷

image

멘토에게

  • Nav 부분 /additem일때 클래스 active를 넣고 싶은데 구현이 잘 안됩니다.
  • form 안에서 엔터를 누르면 formsubmit이되는데. e.preventDefault();e.stopPropagation();했는데도 input enter시 넘어가는거 막으려면 어떻게 해야할까요?

@naynara87 naynara87 changed the base branch from main to React-나윤주 July 2, 2024 14:58
@naynara87 naynara87 changed the title React 나윤주 sprint6 [나윤주] sprint6 Jul 2, 2024
@naynara87 naynara87 requested a review from Taero-Kim July 2, 2024 15:02
@naynara87 naynara87 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jul 2, 2024
console.log(values);
resetForm();
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

요 부분에서 막히셨군요!
여기서

에서의 기본 동작 (제출 및 새로고침)은 잘 막고 계십니다!

그런데 개별 태그들에서도 값을 모두 입력한 상태에서, 엔터를 누르면
폼을 제출하려는 기본 동작이 있습니다.
요 개별 의 기본 동작은 form의 onSubmit 핸들러에 preventDefault하는 것만으로는 해결되지 않습니다.

각각의 input에서 Enter를 눌렀을 시, preventDefault를 해주어야합니다.
따라서 각각 모든 input에는 요 작업을 하기가 번거로우니

태그 자체의 onKeyDown 이벤트에 핸들러를 정의하시는 걸 추천드립니다.

예시)

  const handleFormKeyDown = (event) => {
    // textarea 안에서는 Enter 키를 허용
    if (event.key === "Enter" && event.target.tagName !== "TEXTAREA") {
      event.preventDefault();
    }
  };
...
<form onSubmit={handleSubmit} onKeyDown={handleFormKeyDown} /> 

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

오 해결되었습니다!!

return isActive ? 'nav-link active' : 'nav-link';
}

function Nav() {
Copy link
Collaborator

Choose a reason for hiding this comment

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

addItem 페이지일 때 Nav를 isActive로 변경하고 싶다고 하셨는데,
맥락상 '중고마켓'이라는 Nav를 isActive로 하고 싶으신 것 같아요!

그런데 현재 /additem 이라는 페이지(라우트)에는 isActive가 걸릴 수가 없는 상황입니다.
getLinkStyle에서 전달받는 NavLink의 props.isActive는
페이지(라우트)가 /boards 이거나 /items 일때만 활성화되기 때문입니다!

해결 방법은 여러가지가 있을 것 같습니다.
첫번째 방법)
useLocation이라는 훅을 사용해, 현재 pathname을 알아내고
getLinkStyle함수에 해당 값을 전달한다.

const getLinkStyle = (navProps, pathname) => {
  const isAddItemPage = pathname === '/additem';

  return (navProps.isActive || isAddItemPage) ? 'nav-link active' : 'nav-link';
}
 

const Nav = () => {
  const { pathname } = useLocation();
  
  return (
    ...
    <NavLink to="/items" className={(navProps) => getLinkStyle(navProps, pathname)}>
  )
}

두번째 방법)
라우트 구조 변경
현재: /additem
변경: /items/additem 혹은 /items/add-item

이렇게 변경하면 /items에서 /items/additem 라우트로 이동해도 isActive 상태가 유지될 수 있습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

첫번째

addItem 페이지일 때 Nav를 isActive로 변경하고 싶다고 하셨는데, 맥락상 '중고마켓'이라는 Nav를 isActive로 하고 싶으신 것 같아요!

그런데 현재 /additem 이라는 페이지(라우트)에는 isActive가 걸릴 수가 없는 상황입니다. getLinkStyle에서 전달받는 NavLink의 props.isActive는 페이지(라우트)가 /boards 이거나 /items 일때만 활성화되기 때문입니다!

해결 방법은 여러가지가 있을 것 같습니다. 첫번째 방법) useLocation이라는 훅을 사용해, 현재 pathname을 알아내고 getLinkStyle함수에 해당 값을 전달한다.

const getLinkStyle = (navProps, pathname) => {
  const isAddItemPage = pathname === '/additem';

  return (navProps.isActive || isAddItemPage) ? 'nav-link active' : 'nav-link';
}
 

const Nav = () => {
  const { pathname } = useLocation();
  
  return (
    ...
    <NavLink to="/items" className={(navProps) => getLinkStyle(navProps, pathname)}>
  )
}

두번째 방법) 라우트 구조 변경 현재: /additem 변경: /items/additem 혹은 /items/add-item

이렇게 변경하면 /items에서 /items/additem 라우트로 이동해도 isActive 상태가 유지될 수 있습니다.

첫번째 방법으로 했습니다. 왜냐면 요구사항이 /additem 주소라고 명시 되어 있어서 그렇게 했습니다. 폴더링은 별도로 수정했습니다

return (
<>
<div className="section-header">
<h3 className="title">판매 중인 상품</h3>
<input type="text" className="search" placeholder="검색할 상품을 입력해주세요"></input>
<a href="./additem.html" className="btn-primary btn-sm btn-add" type="button">
<a href="./additem" className="btn-primary btn-sm btn-add" type="button">
Copy link
Collaborator

Choose a reason for hiding this comment

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

p2;
보통 리액트에서 이렇게 라우트 경로를 변경하고 싶을 때는 a태그가 아니라 react-router-dom에서 제공하는
useNavigate 훅을 사용합니다!
페이지를 새로고침하고, 새로 리로드하여 이동해야하는 경우 등의 특별한 경우가 아닌 이상,
리액트 프로젝트에서는 a태그로 경로를 이동하는 것을 지양해주세용!

import { useNavigate } from 'react-router-dom';

const handleClickAddItemButton = () => {
  navigate('/additem')
};

<button onClick={handleClickAddItemButton}>...</button>

/>
{tagList.length > 0 && (
<div className="tag-list-input">
{tagList.map((tag, index) => (
Copy link
Collaborator

Choose a reason for hiding this comment

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

p3;
요렇게 태그리스트처럼 추가, 삭제 등 리스트 인덱스의 변화가 많이 일어나는 경우에는
key를 배열 리스트의 index로 주는 걸 지양하면 좋을 것 같아요!

@Taero-Kim
Copy link
Collaborator

윤주님 고생하셨어요! 일단 질문 남겨주신 부분 위주로 봤고
질문에 대한 답변은 코드 리뷰에 포함되어 있어요!

현재 기존 코드와 충돌이 많이 나는 상황이어서 Merge가 되지 않는데, 해당 PR은 닫아드릴까요?

@naynara87
Copy link
Collaborator Author

윤주님 고생하셨어요! 일단 질문 남겨주신 부분 위주로 봤고 질문에 대한 답변은 코드 리뷰에 포함되어 있어요!

현재 기존 코드와 충돌이 많이 나는 상황이어서 Merge가 되지 않는데, 해당 PR은 닫아드릴까요?

충돌은 정리했습니다. 머지 부탁드립니다~

@Taero-Kim Taero-Kim merged commit 8fa5d41 into codeit-bootcamp-frontend:React-나윤주 Jul 2, 2024
@naynara87 naynara87 deleted the React-나윤주-sprint6 branch July 8, 2024 04:39
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