과제 요구사항
업데이트 되는 부분 반영하기(diff)
createVNode
{ type: 'div', props: { id: 'app' }, children: [...] }
normalizeVNode
createElement
// 가상 DOM을 실제 DOM 객체로 변환
document.createElement('div') // 실제 DOM 요소 생성
// 하지만 이 시점에서는 메모리에만 존재!
renderElement
중요한 점
전체 실행 순서
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' }, '추가'),
)
)
);