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

[10팀 이정은] [Chapter 1-2] 프레임워크 없이 SPA 만들기 - 작성중 #56

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

jungenvDev
Copy link

과제 체크포인트

기본과제

가상돔을 기반으로 렌더링하기

  • createVNode 함수를 이용하여 vNode를 만든다.
  • normalizeVNode 함수를 이용하여 vNode를 정규화한다.
  • createElement 함수를 이용하여 vNode를 실제 DOM으로 만든다.
  • 결과적으로, JSX를 실제 DOM으로 변환할 수 있도록 만들었다.

이벤트 위임

  • 노드를 생성할 때 이벤트를 직접 등록하는게 아니라 이벤트 위임 방식으로 등록해야 한다
  • 동적으로 추가된 요소에도 이벤트가 정상적으로 작동해야 한다
  • 이벤트 핸들러가 제거되면 더 이상 호출되지 않아야 한다

심화 과제

1) Diff 알고리즘 구현

  • 초기 렌더링이 올바르게 수행되어야 한다
  • diff 알고리즘을 통해 변경된 부분만 업데이트해야 한다
  • 새로운 요소를 추가하고 불필요한 요소를 제거해야 한다
  • 요소의 속성만 변경되었을 때 요소를 재사용해야 한다
  • 요소의 타입이 변경되었을 때 새로운 요소를 생성해야 한다

2) 포스트 추가/좋아요 기능 구현

  • 비사용자는 포스트 작성 폼이 보이지 않는다
  • 비사용자는 포스트에 좋아요를 클릭할 경우, 경고 메세지가 발생한다.
  • 사용자는 포스트 작성 폼이 보인다.
  • 사용자는 포스트를 추가할 수 있다.
  • 사용자는 포스트에 좋아요를 클릭할 경우, 좋아요가 토글된다.

과제 셀프회고

기술적 성장

코드 품질

학습 효과 분석

과제 피드백

리뷰 받고 싶은 내용

Comment on lines +27 to +37
if (vNode.props) {
Object.entries(vNode.props).forEach(([key, value]) => {
if (key === "className") {
$el.setAttribute("class", value);
} else if (key.startsWith("on")) {
addEvent($el, key.toLowerCase().slice(2), value);
} else {
$el.setAttribute(key, value);
}
});
}

Choose a reason for hiding this comment

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

updateAttributes 함수에 넣어서 속성 처리를 해줄 수 있을 것 같습니다!
(사실.. 저도 템플릿에 있길래 함수에 넣어서 구현한거라 좋은지, 안좋은지 잘은 모르겠지만..)

Choose a reason for hiding this comment

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

예상되는 리스너들을 미리 등록해놓고 구현하신 부분이 이런 방법도 있구나 알게되었습니다!!

Copy link

@ywkim95 ywkim95 left a comment

Choose a reason for hiding this comment

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

코드 너무 잘봤습니다!
열심히 잘 하고 계셔서 필요하신 부분을 공부하시면서 나아가시면 좋은 결과가 있을 것이라고 생각이 들어요!
제가 적어둔 부분들도 집중하다보니 놓치신 부분들인 것 같아요.
2주차도 고생 많으셨고 다음주차도 화이팅입니다!

Comment on lines +24 to +25
child !== false &&
child !== true, // 이것 까지 추가하면 Falsy값이 아니지 않나? boolean을 따로 처리해줘야하나?
Copy link

Choose a reason for hiding this comment

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

이부분은 null을 제외한 나머지를 typeof로 변환하시면 조금 더 깔끔하게 작성하실 수 있을거에요

Comment on lines +28 to +40
root.addEventListener("click", eventHandler);
root.addEventListener("input", eventHandler);
root.addEventListener("change", eventHandler);
root.addEventListener("focus", eventHandler);
root.addEventListener("blur", eventHandler);
root.addEventListener("keydown", eventHandler);
root.addEventListener("keyup", eventHandler);
root.addEventListener("keypress", eventHandler);
root.addEventListener("mouseover", eventHandler);
root.addEventListener("mouseout", eventHandler);
root.addEventListener("mousemove", eventHandler);
root.addEventListener("mouseup", eventHandler);
root.addEventListener("mousedown", eventHandler);
Copy link

Choose a reason for hiding this comment

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

eventType을 가져와서 활용하시는 것도 좋았을 것 같아요! 아마 WeakMap을 활용하시려고 이 방법을 택하신거겠죠? WeakMap은 색인이 어려워서 루프 도는게 안되서 이 방법말고는 저도 따로 생각나는게 없더라구요. 그래서 Map으로 변경했습니다 ㅎㅎ..

oldElement.setAttribute(name.toLowerCase(), "");
} else {
oldElement.setAttribute(name, value);
}
Copy link

Choose a reason for hiding this comment

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

className => class로 변경하는 부분이 빠진 것 같아요!

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