介紹一下vdom?Snabbdom是虛擬DOM實現的一個基礎庫,通過該庫可以構建一個虛擬DOM樹,並高效地完成數據的同步和更新。 ...
1.介紹一下vdom?
- virtual dom, 虛擬DOM
- 使用JS來模擬DOM結構
- DOM變化的對比,放在JS層來做(圖靈完備語言),提高效率
- DOM操作非常昂貴(消耗性能)
2.Snabbdom的使用
var snabbdom = window.snabbdom;
// 定義patch
var patch = snabbdom.init([
snabbdom_class,
snabbdom_props,
snabbdom_style,
snabbdom_eventlisteners
])
// 定義h
var h = snabbdom.h;
var container = document.getElementById('container');
// 生成vnode
var vnode = h('ul#list', {}, [
h('li.item', {}, 'Item 1'),
h('li.item', {}, 'Item 2'),
]);
patch(container, vnode)
// 修改DOM內容
document.getElementById('btn-change').addEventListener('click', function () {
// 生成newVnode
var newVnode = h('ul#list', {}, [
h('li.item', {}, 'Item 1'),
// DOM節點中不同的地方
h('li.item', {}, 'Item B'),
h('li.item', {}, 'Item 3'),
]);
patch(vnode, newVnode)
})
[!NOTE]
核心API總結:
- h('<標簽名稱>', { 屬性 }, [子元素])
- h('<標簽名>', {屬性}, ‘...’)
- patch(container, vnode)
- patch(vnode, newNode)
3.介紹一下diff演算法?
3.1 Diff演算法是什麼
- Linux中: diff 文件1.txt 文件2.txt
- Git中: git diff
- 線上比對工具
3.2 去繁就簡
- diff演算法實現非常複雜,實現難度很大,源碼量很大
- 去繁就簡,講明白核心流程,不關心細節(非常高效的手段)
- 面試官也大部分不清楚細節,但是很關係核心流程的實現
3.3 VDOM為何使用diff演算法?
- DOM操作是昂貴的,因此要儘量減少DOM的操作
- 找出本次DOM必須更新的節點來更新,其他的不更新
- 這個找出的過程,就需要使用diff演算法(找出兩個虛擬DOM的差異)