8 1 4 Virtual DOM 的實現原理

2021-10-23 11:19:05 字數 2023 閱讀 3602

本文為拉勾網大前端高薪訓練營第一期筆記

虛擬dom就是js物件描述dom物件,成本比真實dom低很多,因為真實dom的屬性特別多

以snabbdom為例,匯入時需要這樣寫

import  from 'snabbdom'
md snabbdom-demo

cd snabbdom-demo

yarn init -y

yarn add parcel-bundler

scripts:

dev: parcel index.html --open

build: parcel build index.html

import  from 'snabbdom'

// 1. hello world

// 引數:陣列,模組

// 返回值:patch函式,作用對比兩個vnode的差異更新到真實dom

let patch = init()

// 第乙個引數:標籤+選擇器

// 第二個引數:如果是字串的話就是標籤中的內容

let vnode = h('div#container.cls', ,

create (emptyvnode, vnode)

}}, 'hello world')

// 第乙個引數:可以是dom元素,內部會把dom元素轉換成vnode

// 第二個引數:vnode

// 返回值:vnde

//此時頁面上是hello world

vnode = h('div', 'hello snabbdom')

patch(oldvnode, vnode)

//此時頁面上是hello snabbdom,對比了oldvnode和vnode的差異,然後更新

// 2. div中放置子元素 h1,p

import from 'snabbdom'

let patch = init()

let vnode = h('div#container', [

h('h1', 'hello snabbdom'),

h('p', '這是乙個p標籤')

])settimeout(() => , 2000);

官方提供了6個模組

props

class

dataset

eventlisteners

style

以style和eventlisteners為例

import  from 'snabbdom'

// 1. 匯入模組

import style from 'snabbdom/modules/style'

import eventlisteners from 'snabbdom/modules/eventlisteners'

// 2. 註冊模組

let patch = init([

style,

eventlisteners

])// 3. 使用 h() 函式的第二個引數傳入模組需要的資料(物件)

let vnode = h('div', ,

on:

}, [

h('h1', 'hello snabbdom'),

h('p', '這是p標籤')

對比節點時是對比sel key,如果沒有key,就認為兩個li是一樣的,此時直接更新text

運用diff演算法的Virtual DOM

百科解釋 把樹形結構按照層級分解,只比較同級元素。給列表結構的每個單元新增唯一的 key 屬性,方便比較。傳統的diff演算法根據大o推導法 具體演算法的問題不做細解 的時間複雜度為o n 3 在正常傳統diff演算法的大o推導法算出來的時間複雜度不適和現有的要求。在此時有乙個叫virtual do...

8 14 免費的午餐 2692

為了增加顧客,sally的店鋪決定提供免費午餐,頓時門庭若市,但是不久sally的原材料不足了 因此sally決定公布一項決定 凡是來本店吃免費午餐的,一天吃能吃一次,吃的數量必須比上一次吃的少,點的必須在上一次後面,且免費午餐將只有n個種類任君選擇,為了能吃到最多的免費午餐,你將如何安排每日吃的數...

GDOI2018模擬8 14 神奇的矩陣

輸出一行表示答案 3 3 2 1 2 3 4 5 6 7 8 9 真是神奇的一道題 為了避免絕對值的影響,讓每個數字從小到大加入,對於每個數字考慮貢獻 設f i j 表示以 i,j 為左上角的k k的矩陣中有數的個數 那麼乙個數在加入時,所有包括它的k k矩陣的f的和,就是這個數對答案做的正貢獻 那...