-
Notifications
You must be signed in to change notification settings - Fork 77
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
[13팀 김도은] [Chapter 1-1] 프레임워크 없이 SPA 만들기 #15
base: main
Are you sure you want to change the base?
Conversation
|
||
<div class="space-y-4" id="post-area"> | ||
|
||
${[...postList] |
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 함수로 목록을 구현하신 부분 정말 효율적인 방식인 것 같아요! 🥰
const store = Store.getInstance(); | ||
|
||
export const historyRouter = (path) => { | ||
store.clearListeners(); |
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.
사실 지금으로선 괜찮지만, 라우트를 변경해도 유지되어야 하는 subscriber가 있을 경우를 고려해서 다른 방식을 찾고 싶었는데... 현재 구조에선 찾지 못해서 이렇게 구현했어요ㅎ.ㅎ
nav.addEventListener("click", (e) => { | ||
e.preventDefault(); | ||
|
||
if (e.target.innerHTML === LOGOUT) { |
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.
innerHTML 는 "로그아웃" 이라는 문자열 대신 다른 내용(이를테면 단순 문자열이 아니라 dom logout 과 같은,,)으로 내용이 바뀌면 로직이 동작하지 않을 것 같습니다. 아마도 불변할 id 값을 기준으로 동작시키면 변경에 더 안전할 것 같아요
if (e.target.innerHTML === LOGOUT) { | |
if (e.target.id === LOGOUT) { |
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.
옵저버 패턴, 싱글톤, fsd 구조 등등 뿐만 아니라 서비스 로직도 요구사항을 넘어서서 완성도가 높은 것 같습니다 고생하셨어요 🎉
코드 넘 깔끔한 거 같아용 🥹 멋있슴다 |
Chapter.1-1.mov
과제 체크포인트
기본과제
1) 라우팅 구현:
2) 사용자 관리 기능:
3) 프로필 페이지 구현:
4) 컴포넌트 기반 구조 설계:
5) 상태 관리 초기 구현:
6) 이벤트 처리 및 DOM 조작:
7) 라우팅 예외 처리:
심화과제
1) 해시 라우터 구현
2) 라우트 가드 구현
3) 이벤트 위임
과제 셀프회고
기술적 성장
웹 내장 이벤트 학습
라우터를 구현하며
load
,popstate
,hashchange
와 같은 웹 브라우저 내장 이벤트들에 대해 공부할 수 있었습니다.실무에서는 흔히
click
,submit
,mouseover
등과 같은 사용자 인터페이스 관련 이벤트들만 자주 사용해왔는데, 이번에 과제를 하며 라우팅, 렌더링 등의 작업에 리액트가 많은 부분을 자동화해 주고 있는 덕분에 1번에서 언급한 이벤트들에는 크게 신경을 쓰지 않아도 되었다는 사실을 깨달았습니다.특히나 비슷해 보이는
load
와DOMContentLoaded
이벤트의 차이점에 대해 알게 되었습니다.이미지 등의 다른 리소스를 기반으로 작업이 필요한 경우를 제외하고는, DOM이 준비되면 처리 가능한� 일들은 DOMContentLoaded 이벤트를 트리거로 실행해도 무방함! react hook으로 따지면 load는 useLayoutEffect, DOMContetnLoaded는 useEffect와 유사하다고 느낌
hash router 구현 과정에서 직접 클릭하는 인터랙션으로는 라우팅이 잘 동작하는데, 테스트 코드가 도저히 통과되지 않아 한참을 고심했습니다. 화면을 공유해 팀원분과 같이 살펴보면서 결국 문제를 찾았는데, hashchange를 hashChange로 작성하는 바람에... 이벤트 등록이 제대로 되지 않았던 거였어요. 허무했지만 이것 또한 배움의 과정~~🥲
옵저버 패턴을 이용한 전역 상태 관리 구현
즉시 실행 함수(IIFE, Immediately Invoked Function Expression)
라는 개념을 이용해서 구현할 수 있었습니다.코드 품질
학습 효과 분석
과제 피드백
리뷰 받고 싶은 내용
const page = Routes[pathToGo] ?? Routes[404];
)그치만 이 방법 또한 마음에 들지 않아서 더 나은 아이디어가 있다면 힌트를 주시면 감사하겠습니다!