-
Notifications
You must be signed in to change notification settings - Fork 0
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
Y_FE_Toy1_Team12 Wikipage TogetherS #11
base: main
Are you sure you want to change the base?
Conversation
헤더와 로그인 및 회원가입 페이지 연결
위키 게시글 댓글 기능 삭제 수정 구현 및 게시글 마크다운 형식 구현
스터디 모집 모달창 버튼 색상
게시글상세페이지 댓글 스타일링
… into ParkEunYeong
갤러리 내비바 공통 스타일 적용
위키페이지 폰트 변경 및 스터디 페이지 css애니 추가
…ikipage-team12 into Y_FE_Toy1_Team12
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- scss를 활용해본 경험이 분명 큰 도움이 될거에요. 다음에는 styled-component로 효율적인 코딩(한 파일 내에서의 일관성이 있어 깔끔하고 가독성이 좋고, 변수사용이 가능하고 등등)을 경험해도 좋을 것 같습니다.
- 다양한 애니메이션을 활용해보신 것 같네요.
- 헤더를 별도로 작업해서 그런지 몰라도 모바일반응형 구현이 조금 아쉽네요. 이 부분은 조금만 손보면 처리 가능할 것 같습니다.
- 사소하지만 사용자경험면에서 팁인데요, 클릭 가능한 부분은 cursor: pointer 지정해주면 사용자가 클릭이 가능한 부분이라는 게 인지가 되어 좋을 것 같아요.
- 요 스터디 목록 부분은 높이를 고정해주면 좋을 것 같아요. 2번째 페이지가 수가 적으니 넘겼을 때 갑자기 화면이 숭덩 잘리는 느낌이 있네요.
- 전에 멘토링 시간 때 React.FC 타입에 대해 물어보셨었는데, 그게 이제 이해가 되네요. 저는 React.FC 를 사용하지 않는다고 했는데, 어떤식으로 컴포넌트(인자) 타입을 지정해주는지 중간에 코멘트 달아놓았으니 참고해주세요!
다들 정말 열심히하셨네요. 수고하셨습니다~ 👏👏
import './_modal.scss'; | ||
import './ModalAddImage.scss'; | ||
import '../../styles/_common.scss'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
typescript config 설정으로 절대경로를 활용하는 방법에 대해 알아보세요!
const modalRef = useRef<HTMLDialogElement | null>(null); | ||
return ( | ||
<div> | ||
<button // 이미지 추가하는 버튼 (Modal open) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
실제 상용화된 서비스라면 주석은 예외적인 상황외에는 없애는 게 좋습니다!
onClick={async () => { | ||
await modalRef.current?.close(); | ||
location.reload(); | ||
}} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요 핸들러를 함수로 정의해서 넘겨줘도 좋을 것 같아요.
그리고 async-await 를 꼭 사용해야했던 이유가 있을까요? 모달을 닫고, 새로고침을 하고 싶었던 걸까요?
굳이 그렇다면, setTimeout으로 걸어도 될 것 같고,
사실은 새로고침말고 해당 부분만 새롭게 불러올 수 있도록 설계되어야할 것 같아요. 그게 SPA 구조에 맞는 거니까요.
const [like, setLike] = useState<number>(0); | ||
const [comment, setComment] = useState<string>(''); | ||
const [commentList, setCommentList] = useState<IComment[]>([]); | ||
const [isChange, setChange] = useState<boolean>(true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
setIsChange 가 네이밍이 더 정확할 것 같네요.
interface IModalComment { | ||
image: string; | ||
imgId: string; | ||
categoryId: string; | ||
commentsListData: any; | ||
writerId: string; | ||
writerName: string; | ||
likeData?: number; | ||
writerImage: any; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
타입 이름 규칙도 정확하고 좋네요. 반드시 interface -> I.. type -> T.. 로 네이밍해야하는 건 아니에요.
저는 Props만 붙여서 활용하기도 합니다. (ex) CommentModalProps
<Link | ||
to="/" | ||
className={`page ${location.pathname === '/' ? 'active' : ''}`} | ||
> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Route가 아니라 Link 를 활용하셨네요.
Link 컴포넌트의 특징을 알고있는 것도 좋을 것 같아요!
link: string | null; // 링크 타입을 string 또는 null로 지정 | ||
} | ||
|
||
const Slide: React.FC<ISlideProps> = ({ backgroundColor, text, imageSrc, link }) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
React.FC 에 대해 질문해주셨던 게 기억나네요.
저는 요렇게 많이 합니다~
const Slide = ({ backgroundColor, text, imageSrc, link }: ISlideProps) => {
..
<div className="slide-content" onClick={handleSlideContentClick}> | ||
<div className="slide-left"> | ||
{text.map((textItem, index) => ( | ||
<div key={index} style={{ display: 'block' }}> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
key는 index만으로 사용하기보다
프로젝트 전체에서 고유할 수 있도록
<div key={`slide-content-text-${index}`} ..
이런식으로 지어주는 게 좋습니다.
// error 핸들링 | ||
const handleError = (error: any) => { | ||
switch (error.code) { | ||
case 'auth/email-already-in-use': |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
에러 핸들링을 신경쓰신 점이 보이네요. 👍
보통 이런 에러코드는 ERR_AUTH_EMAIL_ALREADY_IN_USE
이런 식으로 대문자 + _ 조합으로 만들어서 (백에서 프론트로) 내려주는 편입니다.
<li className="page-item"> | ||
<a className="page-link" href="#"> | ||
1 | ||
</a> | ||
</li> | ||
<li className="page-item"> | ||
<a className="page-link disabled" href="#"> | ||
2 | ||
</a> | ||
</li> | ||
<li className="page-item"> | ||
<a className="page-link disabled" href="#"> | ||
3 | ||
</a> | ||
</li> | ||
<li className="page-item"> | ||
<a className="page-link disabled" href="#"> | ||
4 | ||
</a> | ||
</li> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기는 map을 돌리면 좋겠네요?
과제 내용
배포
개발버전 : https://heartfelt-mandazi-9dce7c.netlify.app/
깃 레포지토리 : https://github.com/noSPkeepgoing/Wikipage-team12
팀원소개
프로젝트 소개
프로젝트 구성
로그인 / 회원가입
메인
갤러리
위키
스터디
에러
기술 스택
프로젝트 문서
노션 : https://www.notion.so/7a5c2df8aaf7413982f8895d96d4db07