var h =require('virtual-dom/h')var createElement =require('virtual-dom/create-element')
예시
<p> 요소에 텍스트 'virtual dom'를 넣는다.
var tree =h('p','virtual dom')var rootNode =createElement(tree)document.body.appendChild(rootNode)
요소 안에 여러 요소를 추가 할 때는 []배열로 전달할 수 있다. 또한 배열의 순서대로 출력이 되기 때문에 마크업의 순서를 설정할 수 있다.
var tree =h('div.foo#some-id', ['입력해주세요 ',h('span','some text'),h('input', { type:'text', value:'foo' }),])var rootNode =createElement(tree)document.body.appendChild(rootNode)
클래스와 아이디 추가하기
태그 안에 속성을 넣고 싶을 때 {}를 사용해서 넣는 방법도 있지만 아이디와 클래스를 넣을 때는 요소에 바로 입력해서 넣을 수 있다.
h('div.container', list)h('div', { className:'container' }, list)// 위 둘의 결과 값은 같다. <divclass="container"></div>h('div#container', list)h('div', { id:'container' }, list)// 위 둘의 결과 값은 같다. <divid="container"></div>
중간 정리
h, create-element를 사용해서 가상 요소를 생성하고 가상 tree를 만들 수 있다.
var h =require('virtual-dom/h')var createElement =require('virtual-dom/create-element')// Virtual DOMvar tree =h('p','virtual dom')var rootNode =createElement(tree)document.body.appendChild(rootNode)console.log(typeof h) // functionconsole.log(typeof createElement) // functionconsole.log(tree) // VirtualNode (가상노드)
가상 DOM 가상 트리 비교 후, 패치
diff()를 사용해서 기존의 tree와 newtree의 변화를 감지하고 변화된 내용을 변수 patches에 담는다. 그리고 patch()는 변화된 내용을 변수 rootNode에 담아 <body>에 붙인다.
var patches =diff(tree, newTree)patch(rootNode, patches)
var h =require('virtual-dom/h')var createElement =require('virtual-dom/create-element')var diff =require('virtual-dom/diff')var patch =require('Virtual-dom/patch')var count =0functionrender(n) {returnh('p','virtual dom '+ n)}functionupdate() {// 새로운 가상 트리를 생성var newTree =render(++count) // 1, 2, 3, ...// 기존 가상 트리, 새로운 가상 트리하고 변경점이 있는지 확인var patches =diff(tree, newTree)// 변경사항이 발생하면 rootNode에 패치(붙인다)patch(rootNode, patches)}// Virtual DOMvar tree =render(count)var rootNode =createElement(tree)document.body.appendChild(rootNode)window.setInterval(function () {update()},1400)
가상 DOM 배열 데이터 순환 처리
var h =require('virtual-dom/h')var createElement =require('virtual-dom/create-element')var diff =require('virtual-dom/diff')var patch =require('Virtual-dom/patch')var data = ['vue.js','angular','react']functionrender(data) {var lists =data.map(function (item, index) {returnh('li', item) })returnh('ul', lists)}// Virtual DOMvar tree =render(data)var rootNode =createElement(tree)document.body.appendChild(rootNode)
가상 DOM 제거버튼
var data = ['vue.js','angular','react']functionrender(data) {var lists =data.map(function (item, index) {returnh('li', [ item,h('button', { type:'button',onclick:function (e) {data.splice(index,1)console.log(data)update() }, },'delete' ), ]) })returnh('ul', lists)}functionupdate() {var newTree =render(data) var patches =diff(tree, newTree)patch(rootNode, patches)}// Virtual DOMvar tree =render(data)var rootNode =createElement(tree)document.body.appendChild(rootNode)
가상 DOM 추가버튼
버튼을 클릭 했을 때 클릭 할 때마다 1, 2, 3, 4, ... 개씩 추가되는 오류를 방지하기 위해 tree=newTree 구문으로 diff()가 비교하는 값을 바꿔줌
functionupdate() {var newTree =render(data)var patches =diff(tree, newTree)patch(rootNode, patches)// tree 변수 값 업데이트 tree = newTree}
var h =require('virtual-dom/h')var createElement =require('virtual-dom/create-element')var diff =require('virtual-dom/diff')var patch =require('Virtual-dom/patch')var data = ['vue.js','angular','react']functionrender(data) {var lists =data.map(function (item, index) {returnh('li', [ item,h('button', { type:'button',onclick:function (e) {data.splice(index,1)console.log(data)update() }, },'delete' ), ]) })var list =h('ul', lists)var input =h('input.add-content', { type:'text', placeholder:'Add Favorite Framework', })var add_button =h('button.add-button', { type:'button',onclick:function (e) {var input =document.querySelector('.add-content')// 모델 데이터 업데이트data.push(input.value)// 화면 뷰 업데이트update()// 콘솔 변경된 데이터 출력input.value ='' }, },'Add' )var container =h('div.container', [input, add_button, list])return container}functionupdate() {var newTree =render(data)var patches =diff(tree, newTree)patch(rootNode, patches)// tree 변수 값 업데이트 tree = newTree}// Virtual DOMvar tree =render(data)var rootNode =createElement(tree)document.body.appendChild(rootNode)