对于真实 DOM 树来讲,其实就是一棵 DOM 树,为了减少频繁操作,尽而出现了虚拟 DOM,以减少浏览器的性能开销。下面我将实现使用一棵对象树来渲染成一个真实 DOM 树的案例,以更好的理解框架中的虚拟 DOM 是如何运行的。
一、根节点部分
<div id="app"></div>
二、对象 Tree 数据部分
var vdom = [ { name: 'div', attr: { class: 'test', style: { fontSize: '36px' } }, prop: { innerText: 'Hello' }, children: [ { name: 'h1', attr: { style: { color: '#ffaa00', textShadow: '5px 5px 5px rgba(255, 122, 188, 0.3)' } }, prop: { innerText: 'Hello World!' } } ] }, { name: 'img', attr: { style: { width: '240px', borderRadius: '8px', border: '1px solid #ff4400' }, src: 'http://k.sinaimg.cn/n/sinakd20117/76/w1080h596/20210126/4257-kicwvzq6908590.jpg/w700d1q75cms.jpg?by=cms_fixed_width' } }, { name: 'ul', children: [ { name: 'li', attr: { style: { color: '#ff4400', fontWeight: 'bold' } }, prop: { innerText: '数据1' } }, { name: 'li', prop: { innerText: '数据2' } }, { name: 'li', attr: { style: { color: '#3388ff', fontWeight: 'bold' } }, prop: { innerText: '数据3' } } ] }, { name: 'div', attr: { style: { borderTop: '1px solid #cccccc', paddingTop: '20px' } }, children: [ { name: 'button', attr: { style: { cursor: 'pointer', marginRight: '16px' } }, prop: { innerText: '取消', onclick: function () { alert('已经取消'); } } }, { name: 'button', attr: { style: { cursor: 'pointer' } }, prop: { id: 'confirmBtn', innerText: '确认', onclick: function () { alert('确认成功'); } } } ] } ];
三、渲染函数部分
function render (app, vdom) { for (var i = 0; i < vdom.length; i++) { var node = document.createElement(vdom[i].name); var attr = vdom[i].attr; var prop = vdom[i].prop; if (attr) { for (var key in attr) { if (key === 'style') { for (var styKey in attr[key]) { node.style[styKey] = attr[key][styKey]; } } else { node.setAttribute(key, attr[key]); } } } if (prop) { for (var key in prop) { node[key] = prop[key]; } } app.appendChild(node); if (vdom[i].children && vdom[i].children.length) { render(node, vdom[i].children); } } app.appendChild(node); }
四、渲染效果
发表评论