-
Notifications
You must be signed in to change notification settings - Fork 3
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
Drag and Drop Component 만들기 #49
Conversation
Bundle SizesCompared against 0132b1c Route: No significant changes found Dynamic import: None found. |
draft지만 몇가지 남겨봅니다!
시안에서 <Container>
<Card>
<Card>
<Card>
<Dnd listItems={listItems} />
</Container> Card 컴포넌트를 컴파운드패턴으로 만들고, wrapping해서 사용하는 방법은 어떨까유?? // CardList
const CardList = (props) => {
return (
<Reorder.Group values={items} onReorder={setItems} as="section">
{items.map((item, idx) => (
<Card dnd={idx > 3}>
<Card.Title>{props.title}<Card.Title>
<Card.Content>{props.content}<Card.Content>
{idx > 3 && <ReorderIcon dragControls={dragControls} /> }
</Card>
)
}
</Reorder.Group>
)
}
|
엇 Reorder.Group 내부에서도 요소들을 Reorder.Item인가 그걸로 감싸놓지 않으면 DND 영향 안받는걸로 아는데 아닌가유?? Card에 ReorderIcon을 prop으로 만들면 코드 중복을 좀 더 줄일 수 있을 것 같고, 컴파운드로 만들면 확장에 용이한 형태가 될 것 같네요 const CardWithDnd = () => {
return (
<Reorder.Item>
<Card ReorderIcon />
</Reorder.Item>
)
} <Reorder.Group values={items} onReorder={setItems} as="section">
{items.map((item, idx) => idx < 3 ? (
<Card />
) : (
<CardWithDnd />
))
}
</Reorder.Group> |
이부분을 확인해볼게요! |
1 similar comment
Deploying with Cloudflare Pages
|
Codecov ReportPatch coverage:
Additional details and impacted files@@ Coverage Diff @@
## main #49 +/- ##
==========================================
+ Coverage 97.22% 97.56% +0.33%
==========================================
Files 15 25 +10
Lines 72 164 +92
Branches 11 28 +17
==========================================
+ Hits 70 160 +90
- Misses 2 4 +2
☔ View full report in Codecov by Sentry. |
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.
의견 좀 남겨봤습니다 ... 라기엔 고봉밥을 지어버림 ... ㅋㅋㅋㅋㅋㅋㅋ
👍 👍 👍
테스트 코드 처음 작성하시는 것이였으면 힘드셨을 수도 있을 거 같은데 러닝커브 대박 👍
const PlusIcon = () => { | ||
return ( | ||
<svg width="27" height="26" viewBox="0 0 27 26" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||
<path d="M26.2285 12.7266L0.774427 12.7266" stroke="#37C3FF" strokeWidth="2" /> | ||
<path d="M13.498 25.4551V0.000989047" stroke="#37C3FF" strokeWidth="2" /> | ||
</svg> | ||
); | ||
}; | ||
|
||
export default PlusIcon; |
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.
아이콘 같은 경우는 조금 common할 수 있을 거 같아요
이후에 디자이너 분들이 모아주시겠...죠??
그때는 옮기면 좋을 거 같아요 ! components/icon/plusIcon
같은 곳이랄까요 !!
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 CardList; | ||
|
||
const buttonStyle = css` | ||
all: unset; |
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.
저도 unset으로 클리어 하는 걸 좋아하곤 하는데, normalize
를 하지말고 전역으로 unset 해버릴까요?
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 이벤트를 넣으려고 button을 사용했는데, 기본으로 지정되어있던 border가 나오더라구요.
그래서 지정한 건데 전역적으로 지정되어있으면 편할 것 같습니다!
|
||
export default CardList; | ||
|
||
const buttonStyle = css` |
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.
컨벤션 상으로 fooCss
처럼 Css 접미사를 붙이기로 했었던 거로 기억하는데 맞나요?? 🤔
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.
앗 그렇군요 추가하겠습니다
css={css` | ||
display: flex; | ||
align-items: center; | ||
|
||
padding: 26px 28px; | ||
|
||
background-color: #eceef2; | ||
border-radius: 12px; | ||
`} |
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.
인라인 스타일링은 지양하는게 제 취향이긴 한데 어떠신가요 ㅋㅋㅋㅋ
같이 이야기해서 맞춰봐도 좋을 거 같아요 ~~
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.
인라인 스타일링은 지양하는게 제 취향이긴 한데 어떠신가요 ㅋㅋㅋㅋ
같이 이야기해서 맞춰봐도 좋을 거 같아요 ~~
사실 저도.. 안좋아해요.
밑으로 뺄게요! 😆
제가 emotion을 사용하는건 처음이라 많이 알려주세요 ㅎㅎ
<div | ||
css={css` | ||
user-select: none; | ||
flex-grow: 1; | ||
`} | ||
> | ||
<div | ||
css={css` | ||
font-size: 18px; | ||
line-height: 25px; | ||
color: #6b7180; | ||
`} | ||
> | ||
{title} | ||
</div> |
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.
물론 중요하지 않은 화면이라 생각하셔서 div만 사용하신 거 같은데,
조금 시맨틱하게 태그를 바꿔봐도 좋을 거 같은데 어떻게 생각하세요 ?! 🤔
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.
물론 중요하지 않은 화면이라 생각하셔서 div만 사용하신 거 같은데, 조금 시맨틱하게 태그를 바꿔봐도 좋을 거 같은데 어떻게 생각하세요 ?! 🤔
좋아용ul
과 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.
오오 리스트 태그 좋아요 !!
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.
요거 텍스트도 div대신 폰트토큰을 지정해둔 Head1 Head2 Body1 Body2 컴포넌트를 만들어서 사용하는건 어떨까요?
const dragControls = useDragControls(); | ||
|
||
return ( | ||
<Reorder.Item className="dnd-item-component" value={item} as="div" dragListener={false} dragControls={dragControls}> |
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.
여기서 className
이 하는 역할은 무엇인가요??
아하 더 읽어 봤는데, 테스트 때문인가요 ??
테스트 때문이시라면 testid
를 이용하는 게 더 직관적일 거 같다고 생각해요! 🤔
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.
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.
const boardSquares = screen.getAllByTestId('.dnd-item-component');
요롷게 하니까 되네요! 해결했습니당 🙇
<Reorder.Group | ||
data-testid="dnd-component" | ||
as="section" | ||
values={items} | ||
onReorder={setItems} | ||
css={css` | ||
display: flex; | ||
flex-direction: column; | ||
gap: 8px; | ||
`} | ||
> |
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.
👍 👍 👍 👍
const knight = boardSquares[lastIndex - 1]?.firstChild; | ||
|
||
if (!knight) { | ||
throw new Error('knight is null'); | ||
} |
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.
knight
가 의미하는 바가 무엇인가요??
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.
그르게요? 열심히 찾다보니 성공했던거라
의미는 이해하고 있어서 이름 수정하겠습니다!
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.
체스에서 다른 말을 뛰어넘을 수 있는 말이라서 knight를 사용하는 것 같네유
fix: 상수 객체 동결 Co-authored-by: hyesung oh <haesungoh414@gmail.com>
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.
LGTM~
<div | ||
css={css` | ||
user-select: none; | ||
flex-grow: 1; | ||
`} | ||
> | ||
<div | ||
css={css` | ||
font-size: 18px; | ||
line-height: 25px; | ||
color: #6b7180; | ||
`} | ||
> | ||
{title} | ||
</div> |
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.
요거 텍스트도 div대신 폰트토큰을 지정해둔 Head1 Head2 Body1 Body2 컴포넌트를 만들어서 사용하는건 어떨까요?
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.
'cardList의 drag and drop 기능이 올바르게 동작하는지 확인한다' 에서, 드래그 앤 드롭 이후 정말로 데이터가 바뀌었는지 검증하는 내용이 필요할 것 같아요!
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.
저도 그렇게 생각하는데요!
모르겠어요 ㅜㅜ
const knight = boardSquares[lastIndex - 1]?.firstChild; | ||
|
||
if (!knight) { | ||
throw new Error('knight is null'); | ||
} |
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.
체스에서 다른 말을 뛰어넘을 수 있는 말이라서 knight를 사용하는 것 같네유
폰트 토큰은 혜성님 코드가 머지되면 수정하겠습니다! |
드래그 앤 드롭 이후 정말로 데이터가 바뀌었는지 테스트하는거 도와주세요 🙏 |
흠 ... 테스트하기 쉬운 방식으로 CardList 구조를 바꾸던가..?
혹은 특정 이벤트 이후에 동작할 로직을 주입받아서 넘겨 받는 것을 확인한다던가 ... 하면 될 거 같은데 잘은 모르겠네요 저도 ! |
드래그 앤 드롭 이후에 boardSquares의 순서가 바뀌었는지 보는건 어떨까유?? |
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.
👍 👍 👍 고생하셨어요 !!
상태를 어떻게 트래킹하는지를 찾아봐야할 것 같은데 아직 잘 모르겠어서 ㅜㅜ |
컴포넌트 내부의 상태를 트래킹하는 것은 쉽지 않을 것 같아요. 현재 컴포넌트가 데이터를 주입받는게 아니라 내부 데이터에 종속되어 있는데, 이걸 변경하면 테스트가 편해질 것 같아요! ex)
|
CardList 구조를 변경했습니다! |
export interface CardItemType { | ||
title: string; | ||
type: CardType; | ||
id: number; |
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.
id 가 props type으로 정의되어 있는데 사용하지 않고 있는 것 같아요! 물음표를 붙여도 좋을 것 같네용
// TODO : 서버 API 명세서 참고해서 type 변경 | ||
const handleNewItemAdd = () => { | ||
setCardItems((prev) => { | ||
const newId = prev.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.
여기서 newId는 클라에서 임의로 지정해줘도 괜찮을까요..? 서버에서 전달해주는 값이 있으면 그걸 사용하면 더 상태관리가 깔끔할 것 같다는 생각이 듭니다..!!
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.
이부분은 서버에서 데이터를 받아오는 부분이 없고, 나중에 서버로 데이터 보내기만 하면 되는 부분이여서
여기선 임의로 지정해줘도 괜찮을 것 같습니다!
서버에 보내줘야 하는 값는 id가 없어서 아예 id를 제거하는 방향도 생각중이예요
🤔 해결하려는 문제가 무엇인가요?
디자인이 나오기 전에 임시로 Drag and Drop Component 만들어 놓기
🎉 변경 사항
🙏 여기는 꼭 봐주세요!
cardList 테스트
드래그 앤 드롭 이후 정말로 데이터가 바뀌었는지 테스트하는 것이 필요한데, 어떻게 테스트하면 좋을지 모르겠습니다.. 😢
혹시 아시는분 계신가요
아직 명세서가 확정되지 않아서 추가하는 부분과, Type부분은 임시로 넘어갔습니다.
emotion을 사용하는 과정에서 에러가 발생합니다사용된 다른 곳과 똑같이 사용했는데, 에러가 발생하는 이유를 모르겠어요 😢
🌄 스크린샷
참고