시작하기 전 이해하기

과제 요구사항

업데이트 되는 부분 반영하기(diff)

가상돔과 실제돔 만들고 렌더링 하는 순서

  1. createVNode

    { type: 'div', props: { id: 'app' }, children: [...] }
    
  2. normalizeVNode

  3. createElement

    // 가상 DOM을 실제 DOM 객체로 변환
    document.createElement('div') // 실제 DOM 요소 생성
    // 하지만 이 시점에서는 메모리에만 존재!
    
  4. renderElement

  5. 중요한 점

  6. 전체 실행 순서

    JSX → createVNode → normalizeVNode → createElement → renderElement
    ↓        ↓              ↓               ↓               ↓
    <div>   {type,        정규화된        실제 DOM        화면에
    지원    props,        가상 DOM        요소 생성       표시
    </div>  children}      객체           (메모리)        (브라우저)
    

가상돔 개념

흠… 실제 DOM의 가벼운 복사본 같은 느낌이다.

이 개념을 참고하여 ~~

아래 코드는 학습 자료에서 가져온 것이다

<div id="app">
  <ul>
    <li>
      <input type="checkbox" class="toggle" />
      todo list item 1
      <button class="remove">삭제</button>
    </li>
    <li class="completed">
      <input type="checkbox" class="toggle" checked />
      todo list item 2
      <button class="remove">삭제</button>
    </li>
  </ul>
  <form>
    <input type="text" />
    <button type="submit">추가</button>
  </form>
</div>
function virtualDom(type, props, ...children) {
  return { type, props, children: children.flat() }
}

const result = (
	virtualDom('div', { id: 'app' },
	  virtualDom('ul', null,
	    virtualDom('li', null,
	      virtualDom('input', { type: 'checkbox', className: 'toggle' }),
	      'todo list item 1',
	      virtualDom('button', { className: 'remove' }, '삭제')
	    ),
	    virtualDom('li', { className: 'completed' },
	      virtualDom('input', { type: 'checkbox', className: 'toggle', checked: true }),
	      'todo list item 2',
	      virtualDom('button', { className: 'remove' }, '삭제')
	    ),
	  ),
	  virtualDom('form',
	    virtualDom('input', { type: 'text' }),
	    virtualDom('button', { type: 'submit' }, '추가'),
	  )
	)
);