因為使用了virtual dom
,vue.js 具有了跨平台能力
2.1 舉個栗子virtual dom
只是js
物件,是如何呼叫不同平台的 api 的?
const nodeops = else if(platform === 'web')
},parentnode() ,
removechild() ,
nextsibling() ,
insertbefore()
}
3.1 insertfunction insert(parent, elm, ref)
} else }}
3.2 createelmfunction createelm(vnode, parentelm, refelm) else
}
3.3 addvnodesfunction addvnodes(parentelm, refelm, vnodes, startidx, endidx)
}
3.4 removenodefunction removenode(el)
}
3.5 removevnodesfunction removevnodes(parentelm, vnodes, startidx, endidx) }}
4.1 diff 演算法用diff
演算法可以比對出兩棵樹的差異4.2 patch 的過程
1. 在 oldvnode 不存在時function patch(oldvnode, vnode, parentelm) else if(!vnode) else else }}
2. 在 vnode(新vnode節點)不存在時if(!oldvnode)
3. 當 oldvnode 與 vnode 都存在時else if(!vnode)
if(samevnode(oldvnode, vnode)) else
function samevnode()
function sameinputtype(a, b)
6.1 在新舊 vnode 節點相同時,直接 returnfunction patchvnode(oldvnode, vnode)
if(vnode.text)
if(oldch && ch && (oldch !== ch)) else if(ch) else if(oldch) else if(oldvnode.text)
}
6.2 當新舊 vnode 節點都是 isstatic(靜態的),並且 key相同時if(oldvnode === vnode) return
6.3 當新 vnode 節點是文字節點時,直接用if(vnode.isstatic && oldvnode.isstatic && vnode.key === oldvnode.key)
settextcontent
來設定text--nodeops
是適配層6.4 當新 vnode 節點是非文字節點時if(vnode.text)
7.1 定義新舊節點兩邊的索引:if(oldch && ch && (oldch !== ch)) else if(ch) else if(oldch) else if(oldvnode.text)
oldstartidx
、newstartidx
、oldendidx
、newendidx
7.2 while迴圈:
oldstartidx
、newstartidx
、oldendidx
、newendidx
會逐漸向中間靠攏1 當
oldstartvnode
或者oldendvnode
不存在時,oldstartidx
與oldendidx
繼續向中間靠攏,並更新對應的oldstartvnode
與oldendvnode
的指向2 將
oldstartidx
、newstartidx
、oldendidx
、newendidx
兩兩比對的過程一共會出現3 其他情況下2*2=4
種情況7.3 當 while 迴圈結束後,如果
oldstartidx
>oldendidx
,呼叫addvnodes
將新節點多的節點插入7.4 如果滿足
newstartidx
>newendidx
,呼叫removevnodes
將多的舊節點批量刪除function updatechildren(parentelm, oldch, newch) else if(!oldendvnode) else if(samevnode(oldstartvnode, newstartvnode)) else if(samevnode(oldendvnode, newendvnode)) else if(samevnode(oldstartvnode, newendvnode)) else if(samevnode(oldendvnode, newstartvnode)) else else else }}
}if(oldstartidx > oldendidx) else if(newstartidx > newendidx)
}// 產生key與index索引對應的乙個map表
/** * [
* ,
* ,
*
* ]* */
createkeytooldidx(children, beginidx, endidx) ;
for(i = beginidx; i <= endidx; ++i)
return map;
}
linux中配置檔案的差異比較及補丁更新
利用diff可以表兩個檔案之間的差異,並且是以行為單位來進行的,一般用在同乙個檔案或者軟體的新舊版本差異上,例如,假如我們要將 etc passwd 處理為乙個新版本,處理的方式的 刪除第四行,將第六行替換為 no six exist 新的檔案放在tmp test 裡邊 接下裡看下diff的用法 p...
資料互動時狀態碼的意義
http 錯誤 400 400 請求出錯 由於語法格式有誤,伺服器無法理解此請求。不作修改,客戶程式就無法重複此請求。http 錯誤 401 401.1 未授權 登入失敗 此錯誤表明傳輸給伺服器的證書與登入伺服器所需的證書不匹配。401.2 未授權 伺服器的配置導致登入失敗 此錯誤表明傳輸給伺服器的...
VB與Excel在乘冪運算時的結果差異及其不合理性
表示式解析是程式設計工具與電子 等軟體最基本的功能之一,不同的軟體在解析表示式時都遵循一定的運算規則,在不同軟體中,這些運算規則略有差異,導致計算結果也不同。筆者在實踐中發現,vb與 excel 在處理 連續乘冪 這一常見運算時,所遵循的法則有著較大的出入,而且都存在著不合理的因素。本文試圖通過論述...