国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript從初級往高級走系列————Virtual Dom

tinyq / 507人閱讀

摘要:當(dāng)中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會影響布局的,比如。則就叫稱為重繪。

原文博客地址:https://finget.github.io/2018/05/22/virtualDom/
什么是虛擬DOM

用JS模擬DOM結(jié)構(gòu)

DOM變化的對比,放在JS層來做(圖靈完備語言)

提高重繪性能

重繪和回流

頁面渲染過程:

當(dāng)render tree中的一部分(或全部)因?yàn)樵氐囊?guī)模尺寸,布局,隱藏等改變而需要重新構(gòu)建。這就稱為回流(reflow)。

當(dāng)render tree中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會影響布局的,比如background-color。則就叫稱為重繪。

模擬虛擬DOM
  • Item 1
  • Item 2
// js模擬虛擬DOM
{
  tag: "ul",
  attrs:{
    id: "list"
  },
  children:[
    {
      tag: "li",
      attrs: {className: "item"},
      children: ["Item 1"]
    },
    {
      tag: "li",
      attrs: {className: "item"},
      children: ["Item 2"]
    }
  ]
}



  
  Document
  


  

雖然只改變了兩個(gè)數(shù)據(jù),但是整個(gè)table都閃爍了(回流&重繪)

DOM操作是‘昂貴’的,js運(yùn)行效率高

盡量減少DOM操作,盡量減少回流重繪

虛擬DOM如何應(yīng)用,核心API是什么 介紹 snabbdom

snabbdom GitHub地址

官網(wǎng)例子:

var snabbdom = require("snabbdom");
var patch = snabbdom.init([ // Init patch function with chosen modules
  require("snabbdom/modules/class").default, // makes it easy to toggle classes
  require("snabbdom/modules/props").default, // for setting properties on DOM elements
  require("snabbdom/modules/style").default, // handles styling on elements with support for animations
  require("snabbdom/modules/eventlisteners").default, // attaches event listeners
]);
var h = require("snabbdom/h").default; // helper function for creating vnodes

var container = document.getElementById("container");

// h函數(shù)生成一個(gè)虛擬節(jié)點(diǎn)
var vnode = h("div#container.two.classes", {on: {click: someFn}}, [
  h("span", {style: {fontWeight: "bold"}}, "This is bold"),
  " and this is just normal text",
  h("a", {props: {href: "/foo"}}, "I"ll take you places!")
]);
// Patch into empty DOM element – this modifies the DOM as a side effect
patch(container, vnode); // 把vnode加入到container中

// 數(shù)據(jù)改變,重新生成一個(gè)newVnode
var newVnode = h("div#container.two.classes", {on: {click: anotherEventHandler}}, [
  h("span", {style: {fontWeight: "normal", fontStyle: "italic"}}, "This is now italic type"),
  " and this is still just normal text",
  h("a", {props: {href: "/bar"}}, "I"ll take you places!")
]);
// Second `patch` invocation
// 將newVnode更新到之前的vnode中,從而更新視圖
patch(vnode, newVnode); // Snabbdom efficiently updates the old view to the new state
snabbdom h 函數(shù)
var vnode = h("ul#list",{},[
  h("li.item",{},"Item 1"),
  h("li.item",{},"Item 2")
])


{
  tag: "ul",
  attrs:{
    id: "list"
  },
  children:[
    {
      tag: "li",
      attrs: {className: "item"},
      children: ["Item 1"]
    },
    {
      tag: "li",
      attrs: {className: "item"},
      children: ["Item 2"]
    }
  ]
}
snabbdom patch 函數(shù)
var vnode = h("ul#list",{},[
  h("li.item",{},"Item 1"),
  h("li.item",{},"Item 2")
])
var container = document.getElementById("container");
patch(container, vnode);

// 模擬改變
var btnChange = document.getElementById("btn-change");
btnChange.addEventListener("click",function(){
  var newVnode = h("ul#list",{},[
    h("li.item",{},"Item 111"),
    h("li.item",{},"Item 222"),
    h("li.item",{},"Item 333")
  ])
  patch(vnode, newVnode);
})
snabbdom例子



  
  Document
  
  
  
  
  
  


  

看圖,只有修改了的數(shù)據(jù)才進(jìn)行了刷新,減少了DOM操作,這其實(shí)就是vnode與newVnode對比,找出改變了的地方,然后只重新渲染改變的

重做之前的demo



  
  Document


  

核心API

h("<標(biāo)簽名>",{...屬性...},[...子元素...])

h("<標(biāo)簽名>",{...屬性...},"...")

patch(container,vnode)

patch(vnode,newVnode)

簡單介紹 diff 算法 什么是 diff 算法

這里有兩個(gè)文本文件:

借用git bashdiff 命令可以比較兩個(gè)文件的區(qū)別:

在線diff工具

虛擬DOM ---> DOM

// 一個(gè)實(shí)現(xiàn)流程,實(shí)際情況還很復(fù)雜
function createElement(vnode) {
  var tag = vnode.tag  // "ul"
  var attrs = vnode.attrs || {}
  var children = vnode.children || []
  if (!tag) {
    return null
  }

  // 創(chuàng)建真實(shí)的 DOM 元素
  var elem = document.createElement(tag)
  // 屬性
  var attrName
  for (attrName in attrs) {
    if (attrs.hasOwnProperty(attrName)) {
      // 給 elem 添加屬性
      elem.setAttribute(attrName, attrs[attrName])
    }
  }
  // 子元素
  children.forEach(function (childVnode) {
    // 給 elem 添加子元素
    elem.appendChild(createElement(childVnode))  // 遞歸
  })

  // 返回真實(shí)的 DOM 元素
  return elem
}

vnode ---> newVnode

function updateChildren(vnode, newVnode) {
  var children = vnode.children || [];
  var newChildren = newVnode.children || [];

  children.forEach(function (childVnode, index) {
    var newChildVnode = newChildren[index];
    if (childVnode.tag === newChildVnode.tag) {
        // 深層次對比,遞歸
        updateChildren(childVnode, newChildVnode);
    } else {
        // 替換
        replaceNode(childVnode, newChildVnode);
    }
  })
}

function replaceNode(vnode, newVnode) {
  var elem = vnode.elem;  // 真實(shí)的 DOM 節(jié)點(diǎn)
  var newElem = createElement(newVnode);
  // 替換
}
最后

創(chuàng)建了一個(gè)前端學(xué)習(xí)交流群,感興趣的朋友,一起來嗨呀!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99512.html

相關(guān)文章

  • JavaScript初級高級系列————異步

    摘要:之所以是單線程,取決于它的實(shí)際使用,例如不可能同添加一個(gè)和刪除這個(gè),所以它只能是單線程的。所以,這個(gè)新標(biāo)準(zhǔn)并沒有改變單線程的本質(zhì)。 原文博客地址:https://finget.github.io/2018/05/21/async/ 異步 什么是單線程,和異步有什么關(guān)系 什么是event-loop 是否用過jQuery的Deferred Promise的基本使用和原理 介紹一下asyn...

    andot 評論0 收藏0
  • JavaScript初級高級系列————MVVM-Vue

    摘要:原文博客地址如何理解如何實(shí)現(xiàn)是否解讀過的源碼與框架的區(qū)別實(shí)現(xiàn)實(shí)現(xiàn)獨(dú)立初始化實(shí)例兩者的區(qū)別數(shù)據(jù)和視圖的分離,解耦開放封閉原則,對擴(kuò)展開放,對修改封閉在中在代碼中操作視圖和數(shù)據(jù),混在一塊了以數(shù)據(jù)驅(qū)動視圖,只關(guān)心數(shù)據(jù)變化, 原文博客地址:https://finget.github.io/2018/05/31/mvvm-vue/ MVVM 如何理解 MVVM 如何實(shí)現(xiàn) MVVM 是否解讀過 ...

    codercao 評論0 收藏0
  • JavaScript初級高級系列————prototype

    摘要:原文博客地址另一篇轉(zhuǎn)載的從初級往高級走系列原型定義原型是對象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對象的公共祖先。 原文博客地址:https://finget.github.io/2018/09/13/proto/另一篇轉(zhuǎn)載的JavaScript從初級往高級走系列————prototype 原型 定義: 原型是function對象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對象的公共祖先。通...

    SKYZACK 評論0 收藏0
  • javascript知識點(diǎn)

    摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會討論安全的類型檢測惰性載入函數(shù)凍結(jié)對象定時(shí)器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...

    Karrdy 評論0 收藏0
  • JavaScript初級高級系列————ES6

    摘要:采用二八定律,主要涉及常用且重要的部分。對象是當(dāng)前模塊的導(dǎo)出對象,用于導(dǎo)出模塊公有方法和屬性。箭頭函數(shù)函數(shù)箭頭函數(shù)把去掉,在與之間加上當(dāng)我們使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的對象,就是定義時(shí)所在的對象,而不是使用時(shí)所在的對象。 ES6 原文博客地址:https://finget.github.io/2018/05/10/javascript-es6/ 現(xiàn)在基本上開發(fā)中都在使用ES6,瀏覽器環(huán)境...

    孫淑建 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<