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

[3팀 허원영] [Chapter 1-2] 프레임워크 없이 SPA 만들기 #48

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

Conversation

wonyoung2257
Copy link

@wonyoung2257 wonyoung2257 commented Dec 26, 2024

과제 체크포인트

기본과제

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

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

이벤트 위임

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

심화 과제

1) Diff 알고리즘 구현

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

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

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

과제 셀프회고

기술적 성장

코드 품질

학습 효과 분석

과제 피드백

리뷰 받고 싶은 내용

Copy link

@hdlee0619 hdlee0619 left a comment

Choose a reason for hiding this comment

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

한 주도 고생하셨습니다ㅎㅎ

Comment on lines +6 to +18
if (!container._oldVNode) {
container._oldVNode = null;
}

const normalizedVNode = normalizeVNode(vNode);
if (!container._oldVNode) {
container.appendChild(createElement(normalizedVNode));
} else {
updateElement(container, normalizedVNode, container._oldVNode);
}

setupEventListeners(container);
container._oldVNode = normalizedVNode;

Choose a reason for hiding this comment

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

저는 변수를 따로 만들어둔 다음에 oldVNode를 저장해뒀는데, container에 _oldVNode를 프로터피 바인딩을 사용하는 방식이 더 깔끔해보이는 것 같아요!

target.setAttribute("class", newProps[key]);
} else if (key.startsWith("on") && typeof newProps[key] === "function") {
const eventName = key.toLowerCase().substring(2);
// removeEvent(target, eventName);

Choose a reason for hiding this comment

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

저는 주석은 항상 지워두는 편인데, 예전에 다니던 회사에서는 남겨두는 경우도 많이 본 것 같아요..!
원영님은 주석에 대해서 어떻게 생각하시는지 궁금합니다ㅎㅎ

Copy link
Author

Choose a reason for hiding this comment

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

사실 저런 주석은 지우는게 맞는거 같아요 ㅋㅋ 코치님도 사용하지 않는 주석을 지우라고 피드백 주셨더라구요...

@@ -53,5 +53,26 @@ export const globalStore = createStore(
userStorage.reset();
return { ...state, currentUser: null, loggedIn: false };
},
likePost(state, postId) {

Choose a reason for hiding this comment

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

이번주 수고하셨습니다. 좋아요 기능을 여기서 관리하는게 깔끔하군요

Copy link

@Suyeon-B Suyeon-B left a comment

Choose a reason for hiding this comment

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

역시 프짱...
직접 구현하려고 노력하신 흔적이 보이는 PR이었습니다.
이번 한 주도 고생하셨습니다~!! 👏

export const PostForm = () => {
const { addPost } = globalStore.actions;

Choose a reason for hiding this comment

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

createStore에 actions도 따로 정의가 되어 있었군요! 🤩

Choose a reason for hiding this comment

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

이번에 코치님께 이런 피드백을 받았어요~!!
원영님께도 도움이 될 것 같아서 공유드립니다 🙇‍♀️ 👍

스크린샷 2024-12-28 오후 2 17 43

Comment on lines +3 to +11
/**
* @typedef {Object} VNode
* @property {string|function} type - 요소의 타입
* @property {Object | null} props - 요소의 속성
* @property {Array<*>} children - 요소의 자식 노드
*/

function updateAttributes($el, props) {}
export function createElement(vNode) {
if (

Choose a reason for hiding this comment

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

원영님 코드를 보면 코드 자체도 읽기 편한데 주석도 굉장히 잘 작성되어 있네요...!👍

Copy link
Author

Choose a reason for hiding this comment

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

감사합니다 ㅎㅎ

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.

6 participants