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

[2주차] 변지혜 미션 제출합니다. #3

Open
wants to merge 11 commits into
base: master
Choose a base branch
from

Conversation

mod-siw
Copy link

@mod-siw mod-siw commented Sep 22, 2023

2주차 미션

안녕하세요! 18기 프론트 변지혜입니다.
react가 바닐라 js보다는 익숙하다고 생각해왔었는데,
한 번 바닐라로 만들어봤던 걸 똑같이 react로 만드려니 처음에는 조금 헤맸습니다.
React로 같은 결과물을 만들어보니 훨씬 다양한 방식을 고민해볼 수 있었던 과제였습니다~
추가 기능에 욕심이 났지만.. 1주차 구현에 집중해보았습니다!

배포링크

배포 링크

Key Questions

  • Virtual-DOM은 무엇이고, 이를 사용함으로서 얻는 이점은 무엇인가요?

실제 DOM의 가상 복사본인, 말 그대로 가상의 DOM.

  1. 데이터가 업데이트되면 virtual DOM 전체가 리렌더링됩니다.
  2. 이전에 있었던 Virtual DOM과 현재 값을 비교합니다.
  3. 바뀐 부분만 DOM에 업데이트합니다.

위 과정을 거쳐 바뀐 부분만 업데이트하기 때문에 업데이트를 효율적으로 최적화하는 데에 도움을 받을 수 있습니다.

  • 미션을 진행하면서 느낀, React를 사용함으로서 얻을수 있는 장점은 무엇이었나요?

컴포넌트별로 나눠서 코드를 작성한다는 점에서 한 파일의 코드 볼륨이 상대적으로 줄어든다는 장점이 있습니다. 코드 가독성이 보다 향상되고 유지보수가 상대적으로 용이합니다!

또한 상태 변화에 대한 업데이트가 자동적으로 된다는 점이 좋았습니다. 바닐라 js에서는 직접 함수를 호출하여 상태 관리를 해줬어야 했지만 React에서는 이를 따로 작성하지 않아도 수행된다는 점이 장점으로 느껴졌습니다.

  • React에서 상태란 무엇이고 어떻게 관리할 수 있을까요?

컴포넌트 내에서 관리되는 데이터의 상태를 말합니다. 컴포넌트에서 보여줘야 하는 내용이 사용자에 의해서 변경되어야 할 때 사용됩니다. 컴포넌트 내에서 변경이 가능하고, 하위 컴포넌트에 상속이 가능합니다. 일반 변수와 달리 state는 값이 변경될 경우 연관된 컴포넌트에 리렌더링이 발생합니다.

** useState **
useState Hook을 이용해 state를 생성하고, 초기 데이터를 설정하고, setState 함수로 state를 변경하여 동적으로 상태를 관리할 수 있습니다.

** useEffect **
mount, update, unmount effect 등의 부수 효과를 감지할 수 있는 내장 Hooks입니다. 설정한 의존성 배열 안의 변수 값이 변경되면 DOM이 변경된 이후 이펙트 함수를 실행하는 식으로, 리렌더링 이후에 실행되는 Hook 입니다.

이외에도 useRef, Custom Hook 등 상태를 관리할 수 있는 다양한 Hook가 있습니다.

  • Styled-Components 사용 후기 (CSS와 비교).

css와 비교했을 때 컴포넌트별로 스타일을 작성할 수 있다는 점이 좋았습니다.
그리고 jsx에서 정의한 props 등을 가져와 스타일 적용하는 데에 활용할 수 있다는 점이 큰 장점이라고 생각합니다.
동적인 스타일을 적용하기가 css보다 쉽다는 점이 좋았습니다.
또한 styled(다른 컴포넌트 이름) 을 이용해 코드 중복을 줄이는 동시에 추가적인 확장까지 가능하다는 점도 장점입니다.

단점은 컴포넌트 명이 개발자 도구 elements 창에서 원래의 이름대로 읽을 수 없다는 점입니다.
직접 짠 코드니 구조를 알고 있어 덜 불편했지만 아예 처음 코드를 보는 사람이 보면 꽤 헷갈릴 것 같습니다.

후기

context를 사용해볼까 싶었지만 시간도 시간이고, 주어진 안내 멘트에 기본 react만 활용해도 된다는 말이
은연 중에 그렇게 하기를 추천하는 것일까 하여 useState 로 간단하게 작성해보았습니다.
확실히 컴포넌트 단위로 쪼개니 코드 보기도 편하고 React의 편리함을 실감하는 과제였습니다!
1주차 과제를 재현하는 데에 충실했습니다. 다른 기능들을 넣었다면 더 좋았겠다는 아쉬움이 남아있긴 합니다..😅
1주차 코드 리뷰를 참고하여 코드를 보완했습니다. ( 반응형 단위, list container scroll 등 )
여전히 많이 아쉬운 코드와 기능들이지만... 제출에 의의를 둬봅니다....!

편하게 피드백해주시면 많은 도움될 것 같습니다!!

p.s. 로컬에서는 파비콘까지 잘 보이는데 왜 배포링크에서는 안 보일까요..? 1주차와 똑같은 파비콘이긴 하지만 이유를 아신다면 알려주심 감사하겠습니다🥲

Copy link

@flowerseok flowerseok left a comment

Choose a reason for hiding this comment

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

초록색에 마음이 편안해지네요 고생하셨습니다. 제가 배워갈 것들이 참 많군요 .

if (totalTasks !== 0) {
ratio = completedTasks / totalTasks;
}

Choose a reason for hiding this comment

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

클릭하고 입력 받는 칸과 progress-bar로 완료 할 때마다 percentage가 올라가는 디자인이 너무 이뻐요 . 많은 style이 존재하는 것을 배워가네요 !

setList([...list, newTodo]);
localStorage.setItem("list", JSON.stringify([...list, newTodo]));
};

Choose a reason for hiding this comment

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

todo를 추가하는 기능에, getTodo보다 더 직관적인 addTodo나 createTodo를 사용하는 것이 좋을 것 같아요 !

overflow: hidden;
text-overflow: ellipsis;
`;

Choose a reason for hiding this comment

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

제가 리뷰받았던 내용인데, word-break: break-all;를 추가해 영어길이가 길어졌을 때, 깨지는 것을 방지하는 것이 좋을 것 같아요!

border-radius: 0.3125em;
background-color: transparent;
cursor: pointer;
`;

Choose a reason for hiding this comment

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

퍼센트와 rem을 잘 다루시는 것 같아요. 멋지고 부럽습니다

}
`;

export default GlobalStyle;

Choose a reason for hiding this comment

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

html{ font-size: 62.5%; } 를 추가하면, rem을 사용할 때, 10px = 1rem으로 사용할 수 있어요!

Copy link

@kyuhho kyuhho left a comment

Choose a reason for hiding this comment

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

전체적으로 코드가 깔끔해서 제가 오히려 배워갑니다! todo list UI도 깔끔하고 디테일도 좋아요! 고생하셨습니다 ㅎㅎ

Comment on lines +116 to +119
&::-webkit-scrollbar-thumb {
background: #7adb84;
border-radius: 1.875em;
}
Copy link

Choose a reason for hiding this comment

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

스크롤바까지 디테일 신경쓴게 아주 좋습니다!!

Comment on lines +73 to +76
<div
class="progress-bar"
style={{ width: `${ratio * 100}%` }}
></div>
Copy link

Choose a reason for hiding this comment

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

ratio 값 계산해서 퍼센테이지 바로 구현한 점이 인상 깊습니다 👍

height: 1.25em;
border-radius: 0.3125em;
background-color: #7adb84;
transition: width 0.3s ease-in-out;
Copy link

Choose a reason for hiding this comment

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

ease-in-out 과 같은 속성은 처음 보는데 저도 다음에 사용해봐야겠습니다 !

Comment on lines +44 to +55
{list.map((data) =>
data.completed ? (
<></>
) : (
<TodoListItem
key={data.id}
todo={data}
deleteTodo={deleteTodo}
toggleTodo={toggleTodo}
/>
)
)}
Copy link

Choose a reason for hiding this comment

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

저는 completed 기준으로 todolist, donelist 따로 array를 저장한 후에 map 함수를 사용하였는데, 삼항연산자를 이용해서 예외처리를 하는 방법도 좋은 방법인거 같습니다!

</ProgressContainer>
<TodoForm
onSubmit={submitTodo}
style={{ display: popupVisible ? "none" : "flex" }}
Copy link

Choose a reason for hiding this comment

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

popupVisible 로 동적 UI를 구현한 구조가 깔끔해서 코드 가독성이 좋습니다! 저도 앞으로 가독성을 더 고려해서 짜도록 해야겠네요😊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants