-
Notifications
You must be signed in to change notification settings - Fork 38
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
[서미영] Sprint10 #267
The head ref may contain hidden characters: "Next-\uC11C\uBBF8\uC601-sprint10"
[서미영] Sprint10 #267
Conversation
@mixin font-style($size, $weight, $lineHeight, $color) { | ||
font-size: $size; | ||
font-weight: $weight; | ||
color: $color; | ||
line-height: $lineHeight; | ||
} |
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.
자주 사용하는 속성들을 mixin으로 묶어주신 부분 좋습니다. 👍
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.
감사합니다~!!😆
@mixin font-style($size, $weight, $lineHeight, $color) { | ||
font-size: $size; | ||
font-weight: $weight; | ||
color: $color; | ||
line-height: $lineHeight; | ||
} |
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.
매 파일마다 선언하기 보다는 @import
나 @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.
넵 별도 파일로 만들어서 import 했습니다~!!🫡
|
||
export default function AllArticleItem({ | ||
article: { createdAt, image, likeCount, title, writer }, | ||
}: ArticleProp) { | ||
const titleImage = image ? image : noImg.src; |
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.
이미지가 true 라면 그대로 image를 할당하면 되므로 ||
연산자를 활용해보시면 좋을 것 같습니다. 😁
const titleImage = image ? image : noImg.src; | |
const titleImage = image || noImg.src; |
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.
|| 연산자를 쓰면 훨씬 간단하네요. 삼항연산자만 너무 자주 애용해서😂 다른 연산자도 생각해보겠습니다~!!🫡
|
||
export default function AllArticleList({ | ||
initialArticles, | ||
}: { | ||
initialArticles: Article[]; | ||
}) { | ||
const [articles, setArticles] = useState(initialArticles); | ||
const [orderBy, setOrderBy] = useState<ArticleApiData["orderBy"]>("recent"); | ||
const [orderBy, setOrderBy] = useState(ORDER_TYPE_ENUM.RECENT); |
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.
아래와 같이 수정하면 defaultOrderType에 대한 서비스에서 기본적인 정렬 방식을 어떻게 할지에 대한 정책이 바뀌어도 수정이 편할 것 같아요.
const [orderBy, setOrderBy] = useState(ORDER_TYPE_ENUM.RECENT); | |
const [orderBy, setOrderBy] = useState(defaultOrderType); |
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.
앗 그러네요. defaultOrderType를 만들어놓고 안쓰다니...!! defaultOrderType로 쓰면 말씀하신대로 기본 정렬 정책이 바껴도 하나하나 수정할 필요 없으니 좋네요.😆
)} | ||
</> | ||
)) | ||
: children} |
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.
자식태그로 넣어주는 일반적인 children과 달리 dropdown에 들어가는 item가 없을 때 보여주는 내용으로 보이는데요. 그렇기에 emptyMessageChildren 처럼 조금 더 특정적인 이름을 지어주면 좋을 것 같습니다. 😁
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.
그냥 children으로 하면 의미가 부족하니 더 특징적인 이름이 좋네요~!!😆
그런데 이름을 바꿔주면 드롭다운의 children의 기능으로는 노드를 받지 못하니까 제 의도와는 조금 달라질 거 같습니다~!!
<ul className={`${styles.menu} ${menuClassName}`}> | ||
{isOpen && ( | ||
<> | ||
{items |
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.
items가 비어 있을 때를 대비해 삼항 연산자로 대비를 해둔 부분 좋습니다. 👍
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.
조금 덧붙이자면, items의 타입은 string[]
이고 기본값도 []
로 설정되어 있습니다. 따라서, 조건을 item.length로 하는 것이 삼항연산자로 분기처리를 한 의도를 더 잘 살릴 수 있을 것 같아요!
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.
앗 그러네요. items=null로 초깃값을 넣은 것도 아니고 [] 빈배열을 넣어버렸으니 true값이 되서 제대로 작동이 안되는 코드네요 ㅠㅠㅠㅠㅠ
item.length로 길이 검사하는 방식으로 바꿨습니다!!🫡
import { useEffect, useRef, useState } from "react"; | ||
import logoImg from "@/public/images/icons/ic_plus.svg"; | ||
import xIcon from "@/public/images/icons/ic_x.svg"; | ||
import { FileInputType } from "../../../types/commonTypes"; |
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.preferences.importModuleSpecifier
값을 수정해보시면 좋을 것 같습니다.
TS 모듈 import 경로에 별칭 사용하기
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.
제가 확인해보니 현재 프로젝트에서는 자동완성으로는 절대 경로가 설정되는 게 맞습니다. 제가 저건 따로 수정을 안했네요.🤣 바꿨습니다~!!🫡
자동완성 시에도 상대경로로 추천되면 절대경로로 설정하는 방법이 따로 있군요!! 좋은 방법 감사합니다ㅎㅎ
<Link href="/login"> | ||
<Button>로그인</Button> | ||
<Button href="">로그인</Button> | ||
</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.
부모 요소 Link 태그를 지우고 href 속성에 '/login'을 전달하는 것이 더 좋을 것 같습니다. 😆
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.
앗 Button 컴포넌트에 Link 기능이 포함이라 부모요소에 Link가 필요없는데 안지웠네요😂
와 섬세하게 잘 찾아주셔서 감사합니다~!!
page = 1, | ||
pageSize = 10, | ||
orderBy = "recent", | ||
orderBy = ORDER_TYPE_ENUM.RECENT, |
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.
이 부분도 전체 프로젝트에서 동일한 값을 공유할 수 있도록 orderConstants.ts 파일에서 정의한 defaultOrderType 값을 가져와 적용해 주시면 더 좋을 것 같습니다. 😄
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.
넵 바꿨습니다~!! 확실히 지금은 쓴 곳이 적어서 그나마 빠르게 수정하는데 나중에 엄청난 분량일 때 일일이 수정할 거 생각하면 무섭네요..😂
IMAGE = "이미지", | ||
} | ||
|
||
export const fields: { [id: string]: FieldInfo } = { |
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.
fields 객체는 key는 FIELDTYPE
, value는 FieldInfo
타입입니다.
value의 경우에는 타이핑을 잘 해주셨는데, key의 경우에는 인덱스드 시그니처로 처리하여 문자열 타입으로 처리된 부분이 조금 아쉽습니다.
TypeScript의 Record 유틸리티 타입은 특정 키 타입과 값 타입을 가지는 객체 타입을 정의할 때 사용됩니다. 이를 통해 객체의 키와 값의 타입을 명확히 할 수 있습니다.
Record<K, T>는 다음과 같이 정의됩니다:
- K: 객체의 키 타입을 정의합니다.
- T: 객체의 값 타입을 정의합니다.
type MyRecord = Record<string, number>;
const example: MyRecord = {
key1: 1,
key2: 2,
key3: 3,
};
따라서, 이 경우에도 Record를 활용해 보시면 더 좋을 것 같습니다
export const fields: { [id: string]: FieldInfo } = { | |
export const fields: Record<FIELDTYPE, FieldInfo> = { |
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.
제네릭을 여태 많이 안써봤는데 동적으로 할당하는 곳에는 인덱스드 시그니처 대신 제네릭을 쓰는 게 좋네요~ Record 유틸리티 타입도 새로 알게 되었습니다~!!🫡
미영님, 이번주도 과제 진행하느라 수고 많으셨습니다. 💪💪💪 |
요구사항
기본
심화
주요 변경사항
배포사이트
https://7-sprint-mission.vercel.app/
멘토에게